如何validation该方法是不是在Moq中调用?

我如何validation该方法是不是在Moq中调用?

它是否有像AssertWasNotCalled?

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

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

更新 :从版本3以来,检查上面的问题或Dann的答案下面的更新。

或者,使你的模拟严格,所以如果你调用一个你没有期望的方法,它会失败

 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.")); 

在testing之后运行validation,该testing具有Times.Never枚举设置。 例如

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

被盗: John Foster对这个问题的回答 : “需要帮助更好地理解Moq”

你可能要testing的一个事情是,当一个65岁以上的人进入该方法时,薪酬方法不会被调用

 [Test] public void Someone_over_65_does_not_pay_a_pension_contribution() { Mock<IPensionService> mockPensionService = new Mock<IPensionService>(); Person p = new Person("test", 66); PensionCalculator calc = new PensionCalculator(mockPensionService.Object); calc.PayPensionContribution(p); mockPensionService.Verify(ps => ps.Pay(It.IsAny<decimal>()), Times.Never()); } 

这在最近版本的Moq中不起作用 (至less3.1),应该在答案中提到的Verify方法中指定。

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

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

虽然“抛出”也起作用,但AtMost(0)更具performance力的恕我直言。

使用.AtMostOnce();

真正的testing后,再次调用该方法。 如果它抛出一个exception,它被调用。