Property | Value |
---|---|
Rule ID | PosInfoMoq1001 |
Title | The mocked instances behavior should be defined to Strict mode |
Category | Design |
Default severity | Warning |
A mocked instance has been created with the Loose
or Default
behavior instead of Strict
.
When instantiating a Mock<T>
instance (or using the Mock.Of<T>()
alternative), the MockBehavior
of the Mock
instance should be defined to Strict
.
By default, Moq build instances of mocked instance which have a Loose
behavior for non-setup methods.
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();
}
}
If a Mock<T>
instance of IRepository
is created with the Loose
behavior (default behavior of Moq) and
the GetData()
method has not been setup, the default int
value (0
) will be returned.
[Fact]
public void GetDataFromRepository()
{
// Arrange
var repository = new Mock<IRepository>(); // Default behavior (Loose)
// /!\ No methods on the IRepository has been setup !
var service = new CustomerService(repository.Object);
// Act
var result = service.GetDataFromRepository(); // "result" will be defined to 0.
}
To fix the violation of this rule for the previous example,
set the MockBehavior
to Strict
in the constructor of the Mock<T>
class.
[Fact]
public void GetDataFromRepository()
{
// Arrange
var repository = new Mock<IRepository>(MockBehavior.Strict); // Strict behavior (Loose)
// /!\ No methods on the IRepository has been setup !
var service = new CustomerService(repository.Object);
// Act
var result = service.GetDataFromRepository(); // A "MoqException" will be raised to indicate that the GetData() method has not been setup !
}
The same behavior should be defined if the Mock.Of<T>()
alternative is used:
[Fact]
public void GetDataFromRepository()
{
// Arrange
var repository = Mock.Of<IRepository>(MockBehavior.Strict); // Strict behavior (Loose)
// /!\ No methods on the IRepository has been setup !
var service = new CustomerService(repository);
// Act
var result = service.GetDataFromRepository(); // A "MoqException" will be raised to indicate that the GetData() method has not been setup !
}
To fix a violation of this rule, set the MockBehavior
to Strict
in the constructor of the Mock<T>
class or as the last argument of Mock.Of<T>()
method.
A Visual Studio fixer exists to set explicitely the MockBehavior
to Strict
in the current document, project or solution.
Do not suppress a warning from this rule. Normally all methods called on a mocked instance must be setup.