将 It.IsAny<> 分配给本地变量不起作用?

Assign It.IsAny<> to local var does not work?

我想通过将 It.IsAny<IWhatever> 分配给局部变量来使我的单元测试代码更具可读性,但令我惊讶的是我的模拟无法识别方法调用。

这个有效

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

当我重写如下(提取It.IsAny到本地变量)

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

然后mock returns false,因为方法调用不被识别。

谁能解释为什么第二个选项不起作用?

Setup 方法正在接受一个 Expression,它基本上是一个未编译的 Func。这里的关键是 "uncompiled."

当您将 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