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

只谈情不闲聊 提交于 2020-02-27 23:45:15

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

它有像AssertWasNotCalled这样的东西吗?

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

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

#1楼

被盗: 约翰福斯特回答问题,“需要帮助更好地了解Moq”

您可能想要测试的一件事是,当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()); }

#2楼

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

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

#3楼

使用.AtMostOnce();

在真正的测试之后,再次调用该方法。 如果它抛出异常,则会调用它。


#4楼

更新 :从第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."));

#5楼

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

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

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

虽然“投掷”也有效,但AtMost(0)更具表现力恕我直言。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!