首页 文章

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

提问于
浏览
400

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

它有像AssertWasNotCalled这样的东西吗?

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

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

5 回答

  • -4

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

    在具有 Times.Never 枚举集的测试之后运行验证 . 例如

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

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

  • 10

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

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

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

    虽然"throws"也有效,但 AtMost(0) 更具表现力恕我直言 .

  • 141

    使用.AtMostOnce();

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

相关问题