16

考虑以下情况,我正在测试注入的依赖项的方法是否被调用了特定次数:

[Fact]
public void WhenBossTalksEmployeeBlinksTwice()
{
    // arrange
    var employee = new Mock<IEmployee>();
    employee.Setup(e => e.Blink());

    var boss = new Boss(employee.Object);

    // act
    boss.Talk();

    // assert
    employee.Verify(e => e.Blink(), Times.Exactly(2)); // Passes as expected
    employee.Verify(e => e.Blink(), Times.Exactly(1)); // Fails as expected
}

当我强制测试失败时,输出是:

Moq.MockException:未在模拟上执行 1 次调用:e => e.Blink()

更好的是:

Moq.MockException:调用意外执行了 2 次,而不是 1 次:e => e.Blink()

以下是与测试有关的项目:

public interface IEmployee { void Blink(); }

public class Boss {
    private readonly IEmployee _employee;
    public Boss(IEmployee employee) { _employee = employee; }

    public void Talk() {
        _employee.Blink();
        _employee.Blink();
    }
}

是否可以在失败测试的错误消息中收集并显示调用依赖项方法的实际次数?

我不确定这是否重要,但我使用的是 Moq v3.1.416.3(不是最新的,我知道,但我使用的另一个库尚未更新到 Moq 4.x……)

4

1 回答 1

21

我不知道在 Moq3 中获取信息的直接方法。我要做的是在 Blink 的设置上使用回调。

int count = 0;
employee.Setup(e => e.Blink()).Callback(() => count++);

...
employee.Verify(e => e.Blink(), Times.Exactly(1), "Moq.MockException: Invocation was unexpectedly performed " + count + " times, not 1 time: e => e.Blink()"); // Fails as expected
于 2013-05-28T21:36:33.747 回答