2016-08-04 29 views
-2

次のメソッドがあり、マッピング結果のUnitテストケースをDataReaderに書きたいと考えています。Moqを使用してSqlDataReaderの単体テストケースを作成する

public interface IIMGAdvancedSearchDBProvider 
{ 
    clsGPAdvancedSearchResult GetSearchResult(clsIMGAdvancedImageSearchCriteria searchCriteria); 
} 

public class clsIMGAdvancedSearchSQLDBProvider : IIMGAdvancedSearchDBProvider 
{ 
    public clsGLGJSearchResultItem GetSearchResult(clsIMGAdvancedImageSearchCriteria searchCriteria) 
    { 
     using (var sqlConnection = DfxDbConnection) 
     { 
      using (var sqlCommand = sqlConnection.CreateCommand()) 
      { 
       sqlCommand.Parameters.Add("@userKey", SqlDbType.UniqueIdentifier).Value = State.WebUserKey; 
       sqlCommand.Parameters.Add("@SiteCode", SqlDbType.VarChar).Value = State.SiteCode; 
       sqlCommand.Parameters.Add("@MaxRows", SqlDbType.Int).Value = searchCriteria.MaxRows; 

       //Add required client, client group filter paramters 
       AddClientAndClientGroupFilterParameters(searchCriteria, sqlCommand); 

       sqlCommand.CommandType = CommandType.Text; 
       sqlCommand.CommandText = GetCompleteSQLStatement(searchCriteria); 

       var reader = sqlCommand.ExecuteReader(); 

       return alTransaction(reader); 

       reader.Close(); 
      } 
     } 
     return null; 
    } 

    private clsGLGJSearchResultItem GetJournalTransaction(SqlDataReader reader) 
    { 
     return new clsGLGJSearchResultItem 
     { 

      ClientKey = DfxUtilities.GetGuidValueFromReader(reader, "ClientKey") ?? Guid.Empty, 
      JournalId = DfxUtilities.GetLongValueFromReader(reader, "JournalID") ?? 0, 
      AccountingDate = (DateTime)reader["Date"], 

      JournalSource = 
       (enumJournalSources) 
       Enum.Parse(typeof(enumJournalSources), reader["Source"].ToString()), 

      Description = DfxUtilities.GetStringValueFromReader(reader, "Description"), 
      DebitAmount = DfxUtilities.GetDecimalValueFromReader(reader, "DebitAmount") ?? 0, 
      CreditAmount = DfxUtilities.GetDecimalValueFromReader(reader, "CreditAmount") ?? 0, 
      ClientCode = DfxUtilities.GetStringValueFromReader(reader, "ClientCode"), 
      ClientName = DfxUtilities.GetStringValueFromReader(reader, "ClientName"), 

      Images = GetImageItems(reader) 
     }; 
    } 
} 

誰でもこの問題を解決するのに手伝ってもらえますか?

+0

あなたは何を解決しようとしていますか? –

+0

SqlDataReaderマッピングのテストケースを記述します。 – Sharad

+1

SOはあなたの下請け業者ではありません。あなたが書いたテストに関する特定の問題を抱えている場合や、関連するコードをテストする方法について行った研究について質問がある場合、それらはトピックにあるかもしれません。 –

答えて

1

私はあなたがむしろユニットテストよります統合テストコンポーネントとしてデータ抽象化レイヤ(DAL)インタフェースおよびクラス(のようなIIMGAdvancedSearchDBProviderclsIMGAdvancedSearchSQLDBProvider)の治療したほうが良いと思います。

つまり、データベーススキーマ、トリガー、シードテストデータ+ DAL実装クラス(ExecuteReaderへの呼び出しを含む)のテストを組み合わせます。あなたのようにDALを細くしてビジネスロジックを除外する必要があります。通常、これらの統合テストのために、データベースにテスト・データをセットアップ/解除します。また、これらのDAL統合テスト・クラス用の共通基本クラスを作成して、テスト・データベース接続およびおそらくSQLロギングをセットアップすることもできます。また、エッジテストケースデータを含む別個のテストデータベースを維持するか、またはこのデータをセットアップ/ティアダウンに注入することもできます。ここでは黙っていない。

その後することができますユニットテスト DALインタフェースを使用するコンポーネント/クラスであなたのDALインタフェースIIMGAdvancedSearchDBProviderによって返された値をあざけることにより、その上のビジネス層クラス。私はしばしば最初にDALテストを完了して、実際の生産データのスナップショットをキャプチャしてから、擬似DALオブジェクトからビジネスレイヤーユニットテストに戻します。これにより、本番データにある実際のデータエッジのケースを見逃してしまうモックを作成することがなくなります。

NUnitを使用している場合は、TestCase,PairwiseおよびCombinatorial属性を使用して、ビジネスレイヤーオブジェクトのテストケースを模擬するのではなく模擬してください。私のShouldBeラッパーライブラリーが便利かもしれません。

BTW ... clsクラスプレフィックスの命名規則は非標準です。

関連する問題