有没有一种方法可以将模拟实现委托给实际的类,而无需设置每个方法?

问题描述 投票:0回答:1

假设我有一个想要模拟的接口,以及一个实现该接口的具体类,并且我希望能够验证该模拟是否被调用(简单),但委托实现而无需对每个参数进行设置每个方法调用 - 有没有更简单的方法来做到这一点?

[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);
}

我查看了模拟中的所有方法,但没有看到我在寻找什么...是否还有其他隐藏的东西,或者在另一个有用的库中我可以添加来帮助我做到这一点?

c# moq xunit.net
1个回答
0
投票

对于这样的事情,我会考虑基于 DecoratorTest 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 原则。您只需要实现和维护此类一次,而不是在每个测试用例中实现和维护,因此它更易于维护。

© www.soinside.com 2019 - 2024. All rights reserved.