我想通过将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,因为无法识别方法调用。
有人可以解释为什么第二种选择不起作用吗?
答案 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
}
}