Moq - 具有可为空参数的方法的SetUp时出现意外行为

时间:2016-03-18 07:49:34

标签: c# unit-testing mocking moq

当为可为空的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行为吗?

0 个答案:

没有答案