レガシ コードにリポジトリとそのリポジトリのコンシューマがあります。
コンシューマは、リポジトリに対して複数のメソッド呼び出しを行います。
各メソッド呼び出しは、巨大な結果セットを返します。
コンシューマとリポジトリがどのように動作するかを確認する統合テストがありますが、私には十分ではありません.データベース接続に依存しており、非常に遅く、テストが失敗したかどうかを知るのに役立ちません.リポジトリ、データベース、またはコンシューマへの変更。
この統合テストを変換して、リポジトリの実装とは無関係に、消費者を分離してテストしたいと思います。
しかし、これはレガシー コードであり、その動作をまだ完全には理解していません。また、結果セットが巨大であるため、手動でリポジトリをスタブ化することはできません。これを手書きで書くことができれば、次のようになります。
var mockRepository = new Mock<IRepository>();
mockRepository.SetUp(r => r.GetCustomersInMarket(marketId: 3))
.Returns(
new List<Customer> {
new Customer {
...
},
new Customer {
...
},
... x 100 // large dataset
});
mockRepository.SetUp(r => r.GetProductsInMarket(marketId: 3))
.Returns(
...
);
... x 15 // many different calls need to be set up
var testee = new Consumer(mockRepository.Object); // using dependency injection
var report = testee.GenerateReport();
AssertReportMatchesExpectations(report); // some assertions
だから私がやりたいのは(一度)
var recordingProxy = new RecordingProxy<IRepository>(new Repository());
var testee = new Consumer(recordingProxy);
var report = testee.GenerateReport();
var methodCallLog = recordingProxy.GetLog();
その後
var methodCallLog = GetStoredMethodCallLog(); // load persisted log from file or similar
var replayingProxy = new ReplayingProxy<IRepository>(methodCallLog);
var testee = new Consumer(replayingProxy);
var report = testee.GenerateReport();
AssertReportMatchesExpectations(report); // some assertions
私は、この問題を一般的に解決するために、プロキシとして機能し、インターフェイスの境界を越えるトラフィックを記録および再生する汎用ツールの開発に着手しました。
すでにこのようなものはありますか?
リポジトリのスタブ化の問題を解決する他の方法はありますか
- 大規模なデータセットを返す
- データセットの内容が、既存の動作を観察することによってのみ理解できる場合 (作成者の意図が明確でないため)。
そうでない場合は、この質問に対する回答としてツールを投稿します。