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

问题描述:

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

它有没有像AssertWasNotCalled?

UPDATE:从3.0版开始,一种新的语法,可以用:

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

我想你应该在下面发表你的答案,而不是在你的实际问题中发布它。否则它有点奇怪;) – ForceMagic 2013-06-04 21:29:59

UPDATE:从版本3开始,检查上面问题的更新或Dann的答案。

要么,让你的模拟严格,因此,如果你要求,你没有方法将失败的预期

new Mock<IMoq>(MockBehavior.Strict) 

或者,如果你希望你的模拟,以松,使用.Throws (例外)

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

...或Callback()设置一些可以被声明的标志。 – alex 2009-02-11 16:27:25

使用.AtMostOnce();

真正的测试后,再次调用该方法。如果它抛出一个异常,它被调用。

+1

是不是有点太模糊,断言异常是由嘲讽框架引发的? – alex 2009-02-11 16:02:16

+0

为什么?只需检查例外的类型。如果是我的Moq,那么你很安全。 – 2009-02-11 16:45:54

+6

使用与时间验证.Never是一个更好的选择......我同意亚历克斯这个解决方案的工作原理,但绝对是模糊的。 – 2010-12-05 22:03:15

如提到这不会在Moq的的最新版本(因为至少3.1),它应该在Verify方法中指定的工作答案。

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

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

虽然 “抛出” 也适用,AtMost(0)更有表现恕我直言。

被盗来源:John Foster's answer to the question, "Need help to understand Moq better"

其中之一,你可能要测试的是事物的薪酬方法 时,65岁以上的人传递到 方法

[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()); 
} 
不会被调用

在测试后运行验证,该验证具有Times.Never枚举集。例如

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