2012-03-28 18 views
12

SQL Serverからデータをプルするn層Webアプリケーションがあります。私たちのデータアクセスロジックはSqlDataReaderを返し、そのデータを使用してビジネスオブジェクト(a.k.a.Data Transferオブジェクト)を作成します。ユニットテスト - SqlDataReaderのスタブ

これらのSqlDataReaderオブジェクトから返されたデータを解釈してビジネスオブジェクトを構築するコードを確認するための単体テストを作成します。

したがって、ユニットテスト中にSqlDataReaderオブジェクトを置き換えるためにスタブを作成する必要があるようです。おそらくかなり一般的ですが、SqlDataReaderオブジェクトは通常、複数のレコードセットを返します。複数のレコードセットには、それぞれ複数の行があります。

  1. これは合理的な試みですか?
  2. これらのスタブオブジェクトを作成するにはどうすればよいですか?事前に

感謝

グリフ

答えて

24

自動テストは常に基本的に賢明な努力です:)これをテストすることができるようにする

あなたの最初のステップは、データアクセスロジック・リターンを持つことですSqlDataReader-SqlDataReaderの代わりにIDataReaderを実装すると、IDataReaderとなるので、問題はありません。

ユニットテストでは、DataTableオブジェクトを手動でビルドして入力し、を呼び出して、IDataReaderをテスト対象オブジェクトに渡すことができます。サンプルデータのセットを使用してテストを提供するために、

編集

、私は1つの専用の場所でのデータテーブルの作成を保ち、あなたが使用して各データ・テーブルのObjectMotherを使用してお勧めしたいです。次に、各ObjectMethodクラスにメソッドを配置して、特定のデータを強く型付けされた方法で更新することができます。たとえば:

IDataReader customerDetailsReader = new PersonalDetailsBuilder() 
    .CreateNewTable() 
    .AddStandardData() 
    .AddRow(17, "Customer 17") 
    .ToDataReader(); 
+0

が私たちのIDataReaderオブジェクトの一つは、顧客に関する詳細を返すことを想像して:あなたは、このように使用することができ

public class PersonalDetailsBuilder { private DataTable _dataTable; public PersonalDetailsBuilder CreateNewTable() { this._dataTable = new DataTable("CustomerPersonalDetails") { Columns = new[] { new DataColumn("CustomerId", typeof(int)), new DataColumn("CustomerName", typeof(string)) } }; return this; } public PersonalDetailsBuilder AddStandardData(int numberOfRows = 3) { foreach (int i in Enumerable.Range(1, numberOfRows + 1)) { this.AddRow(i, "Customer " + i); } return this; } public PersonalDetailsBuilder AddRow(int customerId, string customerName) { this._dataTable.Rows.Add(customerId, customerName); return this; } public IDataReader ToDataReader() { return this._dataTable.CreateDataReader(); } } 

は...データリーダー取得するRS1 =個人情報を、 rs2 =アクセス許可。 rs3 - xxxなどです。ほとんどのテストではこれがデフォルトのデータセットとして使用されます。いくつかのテストでは、これらの値のほとんどを使用したいかもしれませんが、データテーブル内のいくつかのプロパティをオーバーライドします。それはどれくらい簡単ですか?ほぼ相続に似ています.... – DrGriff

+0

私は理解していません - あなたは、複数の結果セット、またはデータリーダーのセットのための単一のデータリーダーを意味するのですか?いずれにせよ、私は自分の答えを更新しました。 –

+0

なぜdownvote?誰でも...? –