如何验证Moq中未调用该方法?


466

如何验证未调用该方法 Moq中未

是否有类似AssertWasNotCalled的内容?

更新:从版本3.0开始,可以使用新的语法:

mock.Verify(foo => foo.Execute("ping"), Times.Never());

Answers:


155

更新:从版本3开始,请检查上面问题的更新或下面丹恩的答案。

要么将模拟严格,否则如果调用没有期望的方法,模拟将失败

new Mock<IMoq>(MockBehavior.Strict)

或者,如果您希望模拟放松,请使用.Throws(Exception)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

9
...或Callback()设置一些可以声明的标志。
alex

2
同样,在选项#2中,您不能在常规的Teardown方法中使用VerifyAll-它会失败,说明未满足期望;理想情况下应该通过测试。
Gishu

51
这并不是真正的“未调用验证”,因为它可能会在方法中被捕获并且仍然有效-提供误报!

4
期望现在已弃用
Tomasz Sikora

5
在2009年,这可能是最好的方法,但现在肯定不是。抱歉
Fabio Milheiro

537

Times.Never设置枚举的测试后运行验证。例如

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(),Times.Never());

4
关键是调用模拟之后,Verify(action,Never)调用才开始。我认为这是建立验证调用VerifyAll()后(其中工作)
piers7

简单有效。谢谢。
伊恩·格兰杰

45

被盗:约翰·福斯特(John Foster)对问题的回答“需要帮助更好地了解起订量”

您可能要测试的一件事是,将65岁以上的人传递给pay方法时,该方法不会被调用

[Test]
public void Someone_over_65_does_not_pay_a_pension_contribution() {

    var mockPensionService = new Mock<IPensionService>();

    var person = new Person("test", 66);

    var calc = new PensionCalculator(mockPensionService.Object);

    calc.PayPensionContribution(person);

    mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never());
}

10

这在Moq的最新版本(至少从3.1开始)中不起作用,应Verify在答案中提到的方法中进行指定。

实际上,最好.AtMost(0)在Returns语句之后指定。

var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);

尽管“抛出”也有效,但是AtMost(0)恕我直言更具表现力。


-5

使用.AtMostOnce();

经过真正的测试后,再次调用该方法。如果引发异常,则将其调用。


1
断言嘲笑框架引发了异常,这是否有点晦涩难懂?
alex

为什么?只需检查异常的类型。如果这是我的起订量,那是安全的。
2009年

8
与Times.Never一起使用Verify是一个更好的选择...我同意Alex的观点,该解决方案有效,但绝对晦涩。
哔哔哔声,2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.