如何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,它被调用。