Moq - verify that no methods were called

Unit TestingMockingMoq

Unit Testing Problem Overview


This is a unit-test from one of my controllers in an ASP.NET MVC project, using NUnit and Moq:

[Test]
public void Create_job_with_modelstate_errors_fails()
{
    var job = new JobDto();
    this.controller.ModelState.AddModelError("", "");
        
    ActionResult result = this.controller.Create(job);

    this.jobService.Verify(p => p.SaveJob(It.IsAny<JobDto>()), Times.Never());

    // some other asserts removed for brevity
}

This works fine, but from a maintenance point of view I think this line is more verbose than it needs to be:

this.postService.Verify(p => p.SavePost(It.IsAny<PostDto>()), Times.Never());

What i'd really like to be able to do is something equivalent to...

this.postService.VerifyNoMethodsCalled();

...as all i'm interested in is that my controller doesn't call any methods on the service. Is this possible using Moq?

Unit Testing Solutions


Solution 1 - Unit Testing

You could create the Mock with MockBehavior.Strict, e.g.

this.postService = new Mock<IPostService>(MockBehavior.Strict);

That way, if you don't Setup any expectations, any calls to this.postService will fail

Solution 2 - Unit Testing

Modern answer (Moq 4.8 or later):

mock.VerifyNoOtherCalls();

That method makes sure no calls were made except for any previously verified ones. In this particular case, there are no mock.Verify(...) statements before it. Thus, it will make sure the mock was never called at all.

You will get a failure message like this if any calls were made:

This mock failed verification due to the following unverified invocations:
...

This does not require making the mock strict.

Source: Moq Quickstart

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionricheymView Question on Stackoverflow
Solution 1 - Unit TestingPatrick McDonaldView Answer on Stackoverflow
Solution 2 - Unit TestingMarredCheeseView Answer on Stackoverflow