2016-04-12 1 views
3

リファクタリングしてテスト可能にする必要があるレガシーアプリケーションがあります。 モデルとビューコードに分かれたC#コードで構成されています。 C#モデルコードは、本質的に、高水準のCRUDメソッドを持つ公開APIを公開します。SQLで一次処理が行われるC#コードの単体テスト

C#はそれほど機能していませんが、SQL Serverのストアドプロシージャに実際の作業を委任しています。多くの場合、C#コードは、SQLデータベースで何を処理するかを指示する多数のパラメータを設定することに関心があります。そのような入出力はほとんどありません。

処理の大部分はこれらのストアドプロシージャで行われます。これは数十万のデータベース行であるため、これをすべてORMアプローチ(実際にはC#でデータがメモリにロードされる)に変換するのは実用的ではありません。処理はSQL Server上にとどまるべきです。

私の質問は、何かをユニットテストする方法です。 SQL Serverの手続きのためのユニットテスト(SQLの手続きをあざける)C#のコードのための

  • 書き込みユニットテスト
  • はその後1は、その統合テストを記述する必要があります

    • 書き込み:当然の選択があると思われます全体の機能をテストします。 C#コードには機能がほとんどないので(SQL procを呼び出す単なるスタブなものもあります)、これはテストでも値がありますか?それは私にいくらか冗長に聞こえる。

      私は、SQL Server内でできることよりも優れたテストフレームワークを使用できる統合テストしかできません(SQLバックエンドの知識を無視して実際に単体テストというふうに思うかもしれません)。 「ユニットテスト」手法に違反している。

      このシナリオで最も効果的な解決策は何でしょうか?

      編集: C#のメソッドのほとんどは、下記のサンプルのようになり - いくつかは、いくつかの行より多くの処理を行いますが、本質的には、それはADO.NETコードに沸く:

       
      public void LogImport(int PeriodID, String orgCode, int userID) 
      { 
          TryOpenSQLConnection("ImportSQL.LogImport"); 
      
          try 
          { 
           SqlCommand cmd = new SqlCommand("dbo.LogImport", sqlCn); 
           cmd.CommandType = CommandType.StoredProcedure; 
           cmd.Parameters.AddWithValue("@periodID", PeriodID); 
           cmd.Parameters.AddWithValue("@orgCode", orgCode); 
           cmd.Parameters.AddWithValue("@userID", userID); 
           cmd.ExecuteNonQuery(); 
          } 
          catch (Exception ex) 
          { 
           throw new DataException(" ... ") 
          } 
      } 
      
    +1

    を、私はこの重要な文の妥当性に疑問: を "ここで、本質的にデータ(ORMのアプローチには、このすべてを変換することは現実的ではないようですC#でメモリにロードされます) - 処理はSQL Server上にとどまるはずです。 " 実際に行われた "処理"のタイプに大きく依存します。はい、実際に各列、各行、各行を読み込み、それぞれを.Netで処理したら、はいです。しかし、私はその事実であることを非常に疑う。 –

    +0

    残念ながら、私たちはあなたのプロジェクトについて包括的な記述をすることはできません。私たちはあなたが知っていることを知らない。私たちはあなたが持っているすべての考慮すべき点や、あなたのシステムがどのようにテスト可能であるかを知りません(実際のコードは表示されません。私たちは有用な答えのライブラリを提供しようとしているので、とりわけ具体的な目的コードが存在しない状況では、 "ancedotes"はうまく機能しません。そして、 "このシナリオでは最も効果的なソリューションは何でしょうか?"私たちが持つことのできないあなたのプロジェクトに精通していることを前提としています。 –

    +0

    サンプルコードを提供するように更新しました。ほとんどすべてのC#コードがこのように見えます。 – nepdev

    答えて

    0

    私はあなたを合意統合テストだけを行うべきです。 C#コードがADO.netを扱う以上のことをしていない場合は、DBへのラウンドトリップを実行して、これらのクラスの呼び出しをテストしてください。 あなたが最後にそれをロールバックすることができますので、理想のTransactionScopeでそれをすべてを包む:

    using (new TransactionScope()) { 
        // integration test 
    } 
    
    関連する問題