Returns()
/ReturnsAsync()
method must have the same parameter types of the mocked method/property.Property | Value |
---|---|
Rule ID | PosInfoMoq2013 |
Title | The delegate in the argument of the Returns() /ReturnsAsync() method must have the same parameter types of the mocked method/property. |
Category | Compilation |
Default severity | Error |
The delegate in the argument of the Returns()
/ReturnsAsync()
method must have the same parameter types of the mocked method/property.
The lambda expression, anonymous method or method in the argument of the Returns()
must have the same parameter types of the mocked method/property.
NB: Moq allows to pass a delegate with no argument in the
Returns()
/ReturnsAsync()
method even the setup method contains arguments.
[Fact]
public void Test()
{
var validMock = new Mock<IService>();
validMock.Setup(s => s.GetData(1234))
.Returns((int a) => // OK, the mocked GetData() take a int value as argument.
{
return 1234;
});
validMock.Setup(s => s.GetData(1234))
.Returns(() => // OK, Moq allows no arguments.
{
return 1234;
});
validMock.Setup(s => s.IsAvailable) // OK, property don't have arguments.
.Returns(() =>
{
return true;
});
var invalidMock = new Mock<IService>();
invalidMock.Setup(s => s.GetData(1234))
.Returns((string s) => // Error, the mocked GetData() take a int value as argument.
{
return "Foobar";
});
invalidMock.Setup(s => s.IsAvailable)
.Returns((string s) => // Error, mocked property have no arguments.
{
return "Foobar";
});
}
public interface IService
{
int GetData(int id);
bool IsAvailable { get; }
}
To fix a violation of this rule, be sure the lambda expression, anonymous method or method as parameter of the Returns()
/ReturnsAsync()
method must have the same arguments type of the setup property/method.
Do not suppress an error from this rule. If bypassed, the execution of the unit test will be failed with a ArgumentException
thrown with the “Object of type ‘xxx’ cannot be converted to type ‘yyy’.” message.