3

我在一些遗留代码中有一个存储库和该存储库的使用者。

消费者对存储库进行多次方法调用。

每个方法调用都会返回一个巨大的结果集。

我确实有一个集成测试来检查消费者和存储库的行为方式,但这对我来说还不够好 - 它依赖于数据库连接,速度非常慢,并且无法帮助我知道测试是否因为以下原因而失败对存储库、数据库或使用者的更改。

我想将此集成测试转换为单独测试消费者 - 独立于存储库的实现。

但是因为它是遗留代码,我还没有完全理解它的行为,而且结果集很大,所以我不能手动存根存储库。如果可以手写这个,它看起来像

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

我已经开始研究一个通用工具来充当代理并记录和重放跨越接口边界的流量,以解决这个问题。

那里已经有类似的东西了吗?

还有其他方法可以解决存根存储库的问题吗

  • 返回大型数据集
  • 当数据集的内容只能通过观察现有行为来理解时(因为作者的意图不明确)。

如果没有,我将发布我的工具作为这个问题的答案。

4

0 回答 0