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