16

SQL Server からデータを取得する n 層 Web アプリケーションがあります。データ アクセス ロジックは SqlDataReader を返し、そのデータを使用して Business オブジェクト (別名 Data Transfer オブジェクト) を作成します。

これらの SqlDataReader オブジェクトによって返されたデータを解釈して Business オブジェクトを構築するコードをチェックする単体テストを構築したいと考えています。

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

  1. これは賢明な努力ですか?
  2. これらのスタブ オブジェクトを構築するにはどうすればよいでしょうか。

よろしくお願いします

グリフ

4

1 に答える 1

30

自動化されたテストは、基本的に常に賢明な努力です:)

これをテストできるようにするための最初のステップは、データ アクセス ロジックが -implements ではなく を返すようにIDataReaderすることです。問題はありません。SqlDataReaderSqlDataReaderIDataReader

単体テストでは、DataTableオブジェクトを手動で作成および設定し、呼び出しdataTable.CreateDataReader()て をIDataReaderテスト対象のオブジェクトに渡すことができます。

編集

テストに一連のサンプル データを提供するには、使用するデータ テーブルごとにObjectMotherを使用し、データ テーブルの作成を 1 つの専用の場所に保持することをお勧めします。次に、各クラスにメソッドを配置ObjectMethodして、厳密に型指定された方法で特定のデータを更新できます。例えば:

public class PersonalDetailsBuilder
{
    private DataTable _dataTable;

    public PersonalDetailsBuilder CreateNewTable()
    {
        this._dataTable = new DataTable("CustomerPersonalDetails")
        {
            Columns = 
            {
                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();
    }
}

...次のように使用して、データリーダーを取得できます。

IDataReader customerDetailsReader = new PersonalDetailsBuilder()
    .CreateNewTable()
    .AddStandardData()
    .AddRow(17, "Customer 17")
    .ToDataReader();
于 2012-03-28T14:00:51.213 に答える