Problem
How can I make sure that method wasn’t used in Moq?
Is there something similar to AssertWasNotCalled?
UPDATE: As of Version 3.0, a new syntax is available:
mock.Verify(foo => foo.Execute("ping"), Times.Never());
Asked by alex
Solution #1
After you’ve completed the test, use the Times to double-check your work. Never() is a useful option.
_mock.Object.DoSomething()
_mock.Verify(service => service.ShouldntBeCalled(), Times.Never());
Answered by Dan
Solution #2
UPDATE: Since version 3, see the question’s update or Dann’s response below.
Either make your fake rigid or have it fail if you call a method that you don’t expect.
new Mock<IMoq>(MockBehavior.Strict)
Use the if you want your parody to be loose. flings ( Exception )
var m = new Mock<IMoq>(MockBehavior.Loose);
m.Expect(a => a.moo()).Throws(new Exception("Shouldn't be called."));
Answered by Dan Fish
Solution #3
Taken from: John Foster’s response to the query, “Need help to better grasp Moq”
Answered by Chris Marisic
Solution #4
It’s actually preferable to specify. After the Returns statement, use AtMost(0).
var m = new Mock<ISomething>();
m.Expect(x => x.Forbidden()).Returns("foo").AtMost(0);
Although “throws” also work, AtMost(0) is, in my opinion, more expressive.
Answered by miha
Solution #5
Let’s say you have this way and you want to make sure it isn’t being used.
//Setup
var databaseSessionMock = new Mock<IDatabaseSession>();
databaseSessionMock.Setup(m => m.Commit()).Returns(true).Verifiable();
RepositoryFactory.Configure<IDatabaseSession>(databaseSessionMock.Object);
You can perform a test like this.
databaseSessionMock.Verify(m => m.Commit(It.IsAny()), Times.Never(), "Database Session mock object was not used");
Answered by Zia Qammar
Post is based on https://stackoverflow.com/questions/537308/how-to-verify-that-method-was-not-called-in-moq