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

时间:2009-02-11 15:24:21

标签: c# .net moq

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

是否有类似AssertWasNotCalled的内容?

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

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

6 个答案:

答案 0 :(得分:481)

在测试后运行验证,其中设置了Times.Never枚举。 e.g。

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

答案 1 :(得分:144)

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

答案 2 :(得分:38)

被盗: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());
}

答案 3 :(得分:9)

  

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

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

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

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

答案 4 :(得分:0)

假设你有这个方法并且你想测试它没有被调用

//Setup    
var databaseSessionMock = new Mock<IDatabaseSession>();
databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);

你可以这样测试

databaseSessionMock.Verify(m => m.Commit(It.IsAny()), Times.Never(), "Database Session mock object was not used");

答案 5 :(得分:-5)

使用.AtMostOnce();

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