C#学习教程:It.IsAny()和It.IsAny()的值传递给方法设置有什么区别?我正在使用Moq并希望创建构建器类来创建具有预设合理默认值的模拟,这些默认值可以根据需要在测试设置期间被覆盖。我采用的方法使用扩展方法,我在其中传递输入参数值和预期输出。在这样做的过程中,我在语义上等效的代码中看到了不同的行为:直接在设置中传递It.IsAny()的值与在设置中间接传递It.IsAny()的值。示例:publicinterfaceIFoo{boolBar(intvalue);布尔Bar2(整数值);}publicclassFoo:IFoo{publicboolBar(intvalue){returnfalse;}publicboolBar2(intvalue){returnfalse;}}varmock=newMock();mock.Setup(x=>x.Bar(It.IsAny())).Returns(true);Assert.IsTrue(mock.Object.Bar(123));//成功varmyValue=It.IsAny();mock.Setup(x=>x.Bar2(myValue)).Returns(true);Assert.IsTrue(mock.Object.Bar2(123));//Fails两个调用都是等价的(对我来说),但是不能断言对Bar2的调用。为什么会这样?It.IsAny只允许Moq匹配未来的方法调用调用(如果在Setup构造中使用)。调用Setup,Moq只是将方法调用添加到setup方法调用的缓存中。注意例子中Setup的参数类型是Expression>。由于传入了一个Expression,因此不会调用实际的方法调用,Moq能够迭代表达式以确定方法调用的哪些参数是显式的,哪些是It.IsAny参数。它使用此函数来确定运行时的未来方法调用是否与设置的方法调用之一匹配。为了让方法Bar接受参数It.IsAny(),有必要使It.IsAny()返回一个int(因为这是Bar的参数类型)。一般来说,It.IsAny的返回类型必须是T,并且必须选择T的任意值。最自然的选择是default(T),它适用于引用类型和值类型。(在此处阅读有关default关键字的更多信息)。在您的例子中,这是default(int),即0。因此当您实际评估It.IsAny()时,会立即返回值0。但是,当您在Expression上使用It.IsAny()时(如在Setup方法的参数中),方法调用的树结构将被保留,并且Moq可以将未来的方法调用与包装的方法调用相匹配。表达。因此,虽然您不能以任何有意义的方式使It.IsAny()成为变量,但您可以将整个表达式保存在一个变量中:Expression>myExpr=x=>x.Bar2(It.IsAny());模拟.Setup(myExpr).Returns(true);Assert.IsTrue(mock.Object.Bar2(123));最后,我只想提醒您,Moq是开源的。来源可在此处获得。我发现拥有该源代码非常有价值,因此我可以单击并浏览代码和单元测试。It.IsAny()返回类型int并返回0,因此您的第二个设置等效于:mock.Setup(x=>x.Bar2(0)).Returns(true);我没有检查最小起订量代码,但我很确定当它计算设置方法中的表达式时,它认为参数实际上是It.IsAny和普通数字。最好直接在辅助方法中创建设置,不要传递It.IsAny。以上就是C#学习教程:传递It的值有什么区别。多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
