使用Moq Verify()方法调用计数时,失败测试的错误消息包含使用Moq的实际方法调用计数

时间:2013-05-22 13:27:58

标签: unit-testing mocking moq moq-3

请考虑以下内容,我在测试注入依赖项的方法被称为特定次数:

[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   =&GT; e.Blink()

更好的是:

  

Moq.MockException:意外地执行了2次调用,而不是1次:e   =&GT; 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但是......)

1 个答案:

答案 0 :(得分:14)

我不知道在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