有什么区别我正在使用Moq并希望创建生成器类以创建我的模拟与预设合理的默认值,可以根据需要在测试设置期间被覆盖。我采取的方法使用扩展方法,其中我传递输入参数值和期望的输出。在这样做的过程中,我看到不同的行为在我看来是语义上等同的代码:直接在设置中传递It.IsAny(),或在设置中间接传递It.IsAny()的值。例如:通过It.IsAny <int>()和它的值It.IsAny <int>()对方法设置
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断言。为什么是这样?
非常好的解释,本。正如你所描述的那样,我怀疑问题在于表达式评估,而不是It.IsAny的返回值()。我在ILSpy中查看了反射源,并可以看到它。但是无法让我的脑袋围绕它如何解决问题。 再次感谢您的解释。 –
感谢您为我清理巫术!我试图说“var anyFooParam = It.IsAny(); var anyBarParam = It.IsAny ();”看看它是否会让我的测试更具可读性,例如:.Setup(mock => mock.method(anyFooParam,anyBarParam))。Returns(something!) –