如何验证Moq中未调用该方法?
它有像AssertWasNotCalled这样的东西吗?
更新:从3.0版开始,可以使用新语法:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
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."));
在具有 Times.Never 枚举集的测试之后运行验证 . 例如
Times.Never
_mock.Object.DoSomething() _mock.Verify(service => service.ShouldntBeCalled(),Times.Never());
被盗:John Foster's answer to the question, "Need help to understand Moq better"
您可能想要测试的一件事是,当年龄超过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(人);
mockPensionService.Verify(ps => ps.Pay(It.IsAny <decimal>()),Times.Never());}
这在最新版本的Moq中不起作用(至少3.1),应该在答案中提到的Verify方法中指定 .
实际上,最好在返回语句后指定 .AtMost(0) .
.AtMost(0)
var m = new Mock<ISomething>(); m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
虽然"throws"也有效,但 AtMost(0) 更具表现力恕我直言 .
AtMost(0)
使用.AtMostOnce();
在真正的测试之后,再次调用该方法 . 如果它抛出异常,则会调用它 .
5 回答
UPDATE :从版本3开始,请检查上述问题的更新或Dann的答案 .
或者,使你的模拟严格,如果你调用一个你没有期望的方法,它将失败
或者,如果您希望模拟松动,请使用.Throws(例外)
在具有
Times.Never
枚举集的测试之后运行验证 . 例如被盗:John Foster's answer to the question, "Need help to understand Moq better"
var mockPensionService = new Mock <IPensionService>();
var person = new Person(“test”,66);
var calc = new PensionCalculator(mockPensionService.Object);
calc.PayPensionContribution(人);
mockPensionService.Verify(ps => ps.Pay(It.IsAny <decimal>()),Times.Never());
}
实际上,最好在返回语句后指定
.AtMost(0)
.虽然"throws"也有效,但
AtMost(0)
更具表现力恕我直言 .使用.AtMostOnce();
在真正的测试之后,再次调用该方法 . 如果它抛出异常,则会调用它 .