假设我有一个想要模拟的接口,以及一个实现该接口的具体类,并且我希望能够验证该模拟是否被调用(简单),但委托实现而无需对每个参数进行设置每个方法调用 - 有没有更简单的方法来做到这一点?
[Fact]
public void CheckCalcImpl()
{
var mockCalc = new Mock<ICalculator>();
var mock = mockCalc.Object;
var calc = new Calculator();
mockCalc.Setup(mockCalc => mockCalc.Add(It.IsAny<int>(), It.IsAny<int>()))
.Returns((int a, int b) => calc.Add(a, b));
// pretend this is somewhere deep in another method and I want to verify it occurred, but I don't
// want to setup every method on the ICalculator mock
var result = mock.Add(1, 2);
mockCalc.Verify(mockCalc => mockCalc.Add(It.IsAny<int>(), It.IsAny<int>()), Times.Once);
}
我查看了模拟中的所有方法,但没有看到我在寻找什么...是否还有其他隐藏的东西,或者在另一个有用的库中我可以添加来帮助我做到这一点?
对于这样的事情,我会考虑基于 Decorator 的 Test Spy:
public sealed class CalculatorSpy : ICalculator
{
private readonly ICalculator inner;
public CalculatorSpy(ICalculator inner)
{
this.inner = inner;
AddCalls = new List<(int, int)>();
}
public List<(int, int)> AddCalls { get; set; }
// ICalculator members
public int Add(int x, int y)
{
AddCalls.Add((x, y));
return inner.Add(x, y);
}
// More members here...
}
事实上,这可能看起来比使用 Moq 做同样的事情要复杂一些,但它遵循 DRY 原则。您只需要实现和维护此类一次,而不是在每个测试用例中实现和维护,因此它更易于维护。