是否有可能以相同的方式设置方法的所有重载的模拟而不输入所有重载?



我有Serilog.ILogger的mock,我想验证没有调用logger.Error(...)的过载。目前有10个过载,所以我希望避免设置每一个。如果将来添加更多的重载,测试也会中断。

所以,不用这个:

var loggerMockSetup = new Mock<Serilog.ILogger>(MockBehavior.Loose);
loggerMockSetup.Verify(x => x.Error(It.IsAny<String>()), Times.Never);
loggerMockSetup.Verify(x => x.Error(It.IsAny<String>(), It.IsAny<Object[]>()), Times.Never);
loggerMockSetup.Verify(x => x.Error(It.IsAny<Exception>(), It.IsAny<String>()), Times.Never);
// ... and so on for all the overloads

我可以做下面的事情吗?

var loggerMockSetup = new Mock<Serilog.ILogger>(MockBehavior.Loose);
loggerMockSetup.VerifyAllOverloads(x => x.Error, Times.Never);

它必须特定于对x.Error(...)的所有重载,而不是对象上的所有方法,因为我有对x.Information(...)等不相关的调用。

我看到以下选项:

  1. 创建自定义扩展方法VerifyAllOverloads→更少的工作,但需要尽快修改新的超载添加到ILogger
  2. 创建ILogger的自定义实现(例如UnitTestLogger),将所有重载调用转发给一个公共方法。然后,您可以对这种常见方法做出反应→减少工作,但需要在新的重载添加到ILogger
  3. 时进行修改。
  4. 使用反射/源生成器获取ILogger的所有过载,并基于此构建自定义断言→更多的工作,但不需要在ILogger添加新的过载时进行修改

最新更新