I recently had a bit of a brain fade when using Moq. I wanted to check that one method on a mocked class wasn’t called but that another was. Imagine a class like this:
public class Testable
{
IService _service;
public Testable(IService service)
{
_service = service;
}
public void MethodToTest(int i)
{
if(i <= 0)
{
_service.DoSomething();
return;
}
_service.DoSomethingElse();
}
}
I want to test that when if i > 0 only the _service.DoSomethingElse() method is called. I need the mock implementation of IService to throw an exception if the wrong method is called. The solution is to ask Moq to create a strict mock:
using Moq;
using NUnit.Framework;
[TestFixture]
public class TestableTest
{
[Test]
public void MethodToTest_WhenArgumentGreaterThanZero_DoesSomethingElse()
{
// Arrange
Mock<IService> mockService = new Mock<IService>(MockBehavior.Strict);
mockService.SetUp(x => x.DoSomethingElse());
Testable testable = new Testable(mockService.Object);
// Act
testable.MethodToTest(1);
// Assert
mockService.Verify(x => x.DoSomethingElse());
}
}
When MockBehavior.Strict is used, Moq will throw an exception if any method is called that does not have a corresponding setup. In this case if the DoesSomething() method is called and exception will be thrown and the test will fail.