Returns() or ReturnsAsync() methods must be call for Strict mocks| Property | Value |
|---|---|
| Rule ID | PosInfoMoq2000 |
| Title | The Returns() or ReturnsAsync() methods must be call for Strict mocks |
| Category | Compilation |
| Default severity | Error |
A Returns() or ReturnsAsync() of an Mock<T> instance with Strict behavior has not been called after a Setup() call.
When a Mock<T> has been defined with the Strict behavior, the Returns() or ReturnsAsync() methods must be call
when setup a method to mock which returns a value.
[Fact]
public void GetCustomer_ShouldCallRepository()
{
// Arrange
repository = new Mock<IRepository>(MockBehavior.Strict);
repository.Setup(r => r.GetData()); // No Returns() method has been specified.
...
...
// A MoqException will be thrown when the GetData() method will be called.
}
To fix a violation of this rule, call the Returns() or ReturnsAsync() method after the Setup()
call to setup the method to mock.
For example with the following code:
public interface IRepository
{
int GetData();
}
public class CustomerService
{
private readonly IRepository repository;
public CustomerService(IRepository repository)
{
this.repository = repository;
}
public int GetDataFromRepository()
{
return this.repository.GetData();
}
}
For the associated unit test, the Returns() method have to be called for the GetData() method setup.
[Fact]
public void GetCustomer_ShouldCallRepository()
{
// Arrange
repository = new Mock<IRepository>(MockBehavior.Strict);
repository.Setup(r => r.GetData())
.Returns(1234); // The Returns() method is mandatory.
var service = new CustomerService(repository.Object);
// Act
var result = service.GetDataFromRepository();
// Arrange
result.Should().Be(1234);
}
Do not suppress an error from this rule. If bypassed, the execution of the unit test will be failed with a MoqException
thrown with the “Invocation needs to return a value and therefore must have a corresponding setup that provides it.” message.