我如何验证该方法没有被调用在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");

其他回答

使用.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."));

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

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

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

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

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

虽然“投掷”也可以,但AtMost(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");