【发布时间】:2026-02-17 14:50:02
【问题描述】:
我正在使用 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
这两个调用都是等价的(对我来说),但是对 Bar2 的调用失败了断言。这是为什么呢?
【问题讨论】: