将 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
我想通过将 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