我正在使用Moq并且想要创建构建器类来创建具有预设合理默认值的模拟,可以根据需要在测试设置期间覆盖这些默认值.我采用的方法使用扩展方法,我传递输入参数值和预期输出.在这样做的过程中,我看到了在我看来是语义上等效的代码中的不同行为:在一个设置中直接传递It.IsAny()与在设置中间接传递It.IsAny()的值.例:
public interface IFoo
{
bool Bar(int value);
bool Bar2(int value);
}
public class Foo : IFoo
{
public bool Bar(int value) { return false; }
public bool Bar2(int value) { return false; }
}
var mock = new Mock<IFoo>();
mock.Setup(x => x.Bar(It.IsAny<int>())).Returns(true);
Assert.IsTrue(mock.Object.Bar(123)); // Succeeds
var myValue = It.IsAny<int>();
mock.Setup(x => x.Bar2(myValue)).Returns(true);
Assert.IsTrue(mock.Object.Bar2(123)); // Fails
Run Code Online (Sandbox Code Playgroud)
两个调用都是等价的(对我来说),但对Bar2的调用无法断言.为什么是这样?