我如何验证该方法没有被调用在Moq?
它有AssertWasNotCalled之类的东西吗?
更新:从3.0版本开始,可以使用新的语法:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
我如何验证该方法没有被调用在Moq?
它有AssertWasNotCalled之类的东西吗?
更新:从3.0版本开始,可以使用新的语法:
mock.Verify(foo => foo.Execute("ping"), 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");
其他回答
使用VerifyNoOtherCalls(要求Moq为4.8或更高)
这个答案是一个间接的方法。您检查的不是某个特定方法是否没有被调用,而是一般情况下是否没有发生意外调用。
考虑一个完整的模拟测试做两件事:
验证所有预期的呼叫都已拨打 确认没有发生意外呼叫
如果你已经在执行步骤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 Quickstart
假设你有这个方法,你想测试它是否没有被调用
//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");
这在Moq的最新版本中不起作用(至少从3.1开始),它应该在Verify方法中指定 的答案。
实际上,最好在Returns语句之后指定. atmost(0)。
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
虽然“投掷”也可以,但AtMost(0)在我看来更有表现力。
更新:从版本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."));
摘自:John Foster对“需要帮助才能更好地理解Moq”问题的回答
One of the things that you might want to test is that the pay method does not get called when a person aged over 65 is passed into the method [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); }