アプリケーションに、ADO.NET データ プロバイダーをラップするデータ アクセス レイヤーがあります。DAL は、データ プロバイダーから返されたデータを .NET オブジェクトに変換します。DAL の単体テストに反対するようにアドバイスする投稿をたくさん見てきましたが、ループやキャスト、null チェックがたくさんあるため、多くのことがうまくいかないのではないかと心配しています。
RhinoMocks のようなものでモック DbProvider を作成することについていくつか考えましたが、各テストでモックアウトする必要があるインターフェイスの数は圧倒的であり、設定する必要がある期待の数により、テストが非常に難しくなります。読む。各テストは、テスト対象のコードよりも複雑になるようです。これは、単体テストの 3 つの目標の観点からは悲惨なことです。
- 可読性
- 保守性
- 信頼性
使いやすい DbProviderFactory を実装して、xml からサンプル データをロードするというアイデアがありました。テストで依存性注入を介してプラグインできました。これにより、テストの保守がはるかに簡単になります。些細な例は次のとおりです。
[TestCase]
public void CanGetCustomer()
{
var expectedCommand = new XmlCommand("sp_get_customer");
expectedCommand.ExpectExecuteDataReader(
resultSet: @"<customer firstName=""Joe"" lastName=""Blogs"" ... />");
var factory = new XmlProviderFactory(expectedCommand);
var dal = new CustomerDal(factory);
Customer customer = dal.GetCustomer();
Assert.IsNotNull(customer, "The customer should never be null");
Assert.AreEqual(
"Joe", customer.FirstName,
"The customer had an unexpected FirstName.");
}
使いやすい DbProvider を使用するこのアプローチにより、DAL コードのテストが容易になると思います。次の利点があります。
- テスト データは xml にあり、単体テストと共にソース管理に配置できます。外部ファイルまたはテストのインラインにある可能性があります。
- 私は実際のデータベースを使用していないので、これによりステートフルネスの問題が解消されます。したがって、各テストの前にデータベースを既知の状態にする必要はありません。
- 各テストですべての ADO.NET インターフェイスをモック アウトする必要はありません。コードベース全体で再利用できる一連の偽の実装をコーディングします。
人々はこの考えに批判を与えることができますか? これに使用できる同様の実装が既にありますか?
ありがとう