问答中心分类: C#如何验证Moq中没有调用该方法?
0
匿名用户 提问 10小时 前

如何验证未在中调用该方法最小起订量?
它是否有类似AssertWasNotCalled的东西?
更新:从3.0版开始,可以使用新语法:

mock.Verify(foo => foo.Execute("ping"), Times.Never());
6 Answers
0
Dan 回答 10小时 前

测试结束后,使用Times.Never()选项

_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never());
piers7 回复 10小时 前

这里最关键的是,Verify(action,Never)调用之后对模拟的调用。我以为它正在设置稍后调用VerifyAll()的验证(这没有(工作)

Ian Grainger 回复 10小时 前

简单有效。谢谢

Paw Baltzersen 回复 10小时 前

不确定这是否是因为更新的版本,但如果您使用“MockBehavior”设置mock。Strict´并且不添加设置,那么如果调用该方法,它将失败。不需要验证。

0
Chris Marisic 回答 10小时 前

被盗自:约翰·福斯特对问题的回答:“需要帮助才能更好地了解Moq”

您可能需要测试的一件事是,支付方法

[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);
}
0
miha 回答 10小时 前

这在最新版本的Moq中不起作用(至少3.1),应在Verify方法如

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

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

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

0
Neil 回答 10小时 前

我意识到这是一个非常古老的问题,但它刚刚出现在我的侧边栏中,我想添加我的解决方案。
作为设置的一部分,许多单元测试似乎模拟了几个函数,但在测试期间没有使用。
当然,最好启用严格模拟(这意味着任何未明确设置的内容都会引发异常),然后不要设置任何不希望调用的函数。或者换一种方式,只设置一个测试期望调用的函数,其他任何东西都会引发异常。

var thingBeingTested = new Mock<IThink>(MockBehaviour.Strict);

thingBeingTested.ThisWillThrowAnExceptionBecauseItHasNotBeenMocked();
0
MarredCheese 回答 10小时 前

使用VerifyNoOtherCalls(要求最低起订量4.8或更高版本)
这个答案是间接的。您没有检查是否未调用特定方法,而是检查通常没有进行意外调用。
考虑到对模拟的彻底测试有两件事:

  1. 验证是否进行了所有预期调用
  2. 验证未进行任何意外调用

如果您已经在执行步骤1,那么添加步骤2很简单:

// Step 1 (if relevant - see note below)
mock.Verify(..., Times.Exactly(2));
mock.Verify(..., Times.Once());
// ...

// Step 2
mock.VerifyNoOtherCalls();

笔记

  • 如果省略步骤1,那么步骤2将确保根本没有调用mock。
  • 这不需要严格的模拟。
  • 资料来源:Moq快速启动