分配It.IsAny<>到本地var不起作用?

时间:2015-04-03 20:30:45

标签: c# tdd moq

我想通过将It.IsAny<IWhatever>分配给局部变量来使我的单元测试代码稍微更具可读性,并且因为我的mock无法识别方法调用而感到惊讶。

这有效

rotationStrategyMock.
    Setup(rotateStrategy => rotateStrategy.IsRotationRequired(It.IsAny<IProduct>(), null)).
    Returns(true);

当我按如下方式重写它时(将It.IsAny提取到本地var)

var anyProduct = It.IsAny<IProduct>();
rotationStrategyMock.
    Setup(rotateStrategy => rotateStrategy.IsRotationRequired(anyProduct, null)).
    Returns(true);

然后mock返回false,因为无法识别方法调用。

有人可以解释为什么第二种选择不起作用吗?

1 个答案:

答案 0 :(得分:4)

Setup方法正在接受Expression,这基本上是未编译的Func。这里的关键是&#34;未编译。&#34;

直接将It.IsAny<T>()传递给Setup方法时,它生成的对象在运行时之前仍然是未编译的。但是,通过首先将其作为单独的步骤进行实例化,传递给Setup的对象是一个具体的实例。现在,没有任意Product将通过测试,只有那个具体的意义。您可以在以下代码中看到:

public interface ITest
{
    bool IsTrue(int i);
}

public static TestClass
{
    public static void Main()
    {
        var isAny = It.IsAny<int>();
        var tester = new Mock<ITest>();
        tester.Setup(t => t.IsTrue(isAny)).Returns(true);
        Console.WriteLine(tester.Object.IsTrue(1));     //false
        Console.WriteLine(tester.Object.IsTrue(isAny)); //true
    }
}

还有more in-depth answer here