当为可为空的param传递null值时,Moq忽略SetUp并按其默认的MockBehavior(Loose)行为。
public interface INumberGen
{
//Also fails if marked as an optional param (int? greaterThan = null)
int GenerateNumber(int? greaterThan);
}
public class NumberProvider
{
private readonly INumberGen numberGen;
public NumberProvider(INumberGen numberGen)
{
this.numberGen = numberGen;
}
public int GetANumber(int? greaterThan)
{
return numberGen.GenerateNumber(greaterThan);
}
}
[TestFixture]
public class NumberProviderTests
{
private Mock<INumberGen> mockNumberGen;
private NumberProvider sut;
[SetUp]
public void SetUp()
{
mockNumberGen = new Mock<INumberGen>();
sut = new NumberProvider(mockNumberGen.Object);
}
[TestCase(-1, 100)]
[TestCase(0, 233)]
[TestCase(-777, -99)]
[TestCase(null, 255)] //Fails, not going through explicit setup (return is based on default behaviour [loose mock])
public void GetANumber_Returns_SameValueReturnedByNumberGen_Test(
int? greaterThan,
int expected)
{
mockNumberGen
.Setup(x => x.GenerateNumber(It.IsAny<int?>()))
.Returns(expected);
var actual = sut.GetANumber(greaterThan: greaterThan);
Assert.AreEqual(expected, actual);
}
}
使用null参数调用mocked方法的[TestCase(null,255)]不返回预期值。这是可空类型的预期Moq行为吗?