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

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

它有AssertWasNotCalled之类的东西吗?

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

mock.Verify(foo => foo.Execute("ping"), Times.Never());
101934 次浏览

使用.AtMostOnce ();

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

更新:从版本3开始,检查上面的问题或下面Dann的答案的更新。

或者,将mock设置为严格的,以便在调用没有expect的方法时失败

new Mock<IMoq>(MockBehavior.Strict)

或者,如果你想要你的mock是松散的,使用.Throws(Exception)

var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));

这在最近的Moq版本中不起作用(至少从3.1开始),它应该在Verify方法中指定 答案。< / p >

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

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

虽然“投掷”也可以,但在我看来,AtMost(0)更有表现力。

偷自:John Foster对“需要帮助才能更好地理解Moq”问题的回答;

你可能想要测试的一件事是支付方法 当65岁以上的人进入 方法< / p >
[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);
}

在测试之后使用Times.Never()选项运行一个验证。

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

假设你有这个方法,你想测试它是否没有被调用

//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");

我知道这是一个非常老的问题,但它刚刚出现在我的侧栏中,我想添加我的解决方案。

作为设置的一部分,许多单元测试似乎模拟了几个函数,但在测试期间并没有使用。

当然,最好启用严格模拟(这意味着任何未显式设置的内容都会抛出异常),然后不要设置任何您不希望被调用的函数。或者换句话说,只设置测试期望调用的函数,其他任何函数都将抛出异常。

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


thingBeingTested.ThisWillThrowAnExceptionBecauseItHasNotBeenMocked();

使用VerifyNoOtherCalls(要求Moq为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进行调用。
  • 这并不需要严格的模拟。
  • 来源:# EYZ0