C# 分配它。IsAny<&燃气轮机;到本地var不起作用?
我想通过将C# 分配它。IsAny<&燃气轮机;到本地var不起作用?,c#,tdd,moq,C#,Tdd,Moq,我想通过将It.IsAny赋值给一个局部变量,使我的单元测试代码的可读性稍微提高一点,但令我惊讶的是,我的mock无法识别方法调用 这很有效 rotationStrategyMock. Setup(rotateStrategy => rotateStrategy.IsRotationRequired(It.IsAny<IProduct>(), null)). Returns(true); 然后,mock返回false,因为无法识别方法调用 有人能解释第二个选项
It.IsAny
赋值给一个局部变量,使我的单元测试代码的可读性稍微提高一点,但令我惊讶的是,我的mock无法识别方法调用
这很有效
rotationStrategyMock.
Setup(rotateStrategy => rotateStrategy.IsRotationRequired(It.IsAny<IProduct>(), null)).
Returns(true);
然后,mock返回false,因为无法识别方法调用
有人能解释第二个选项不起作用的原因吗?设置方法接受一个
表达式
,它基本上是一个未编译的函数
。这里的关键是“未编译”
当您将It.IsAny()
直接传递到Setup方法时,它生成的对象在运行时之前保持未编译状态。但是,通过首先将其作为单独的步骤实例化,传递到Setup
的对象就是一个具体的实例。现在,没有任何任意的产品将通过测试,只有具体的测试。您可以在以下代码中看到这一点:
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
}
}
公共接口测试
{
布尔伊斯特鲁(国际一级);
}
公共静态测试类
{
公共静态void Main()
{
var isAny=It.isAny();
var tester=newmock();
tester.Setup(t=>t.IsTrue(isAny)).Returns(true);
Console.WriteLine(tester.Object.IsTrue(1));//false
Console.WriteLine(tester.Object.IsTrue(isAny));//true
}
}
还有一个方法设置
接受一个表达式
,它基本上是一个未编译的函数
。这里的关键是“未编译”
当您将It.IsAny()
直接传递到Setup方法时,它生成的对象在运行时之前保持未编译状态。但是,通过首先将其作为单独的步骤实例化,传递到Setup
的对象就是一个具体的实例。现在,没有任何任意的产品将通过测试,只有具体的测试。您可以在以下代码中看到这一点:
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
}
}
公共接口测试
{
布尔伊斯特鲁(国际一级);
}
公共静态测试类
{
公共静态void Main()
{
var isAny=It.isAny();
var tester=newmock();
tester.Setup(t=>t.IsTrue(isAny)).Returns(true);
Console.WriteLine(tester.Object.IsTrue(1));//false
Console.WriteLine(tester.Object.IsTrue(isAny));//true
}
}
还有一个很奇怪。我不知道为什么它不起作用,但我觉得它的可读性没有那么强。根据我的经验,您将编写如此多的模拟安装语句,以至于您会对语法感到舒适,并且厌倦了将所有内容提取到局部变量。@RyanBurbidge是的,我必须同意,我实际上是为了另一个It.IsAny()
,但为了解决问题,考虑使用一个更简单的示例。但尽管如此,我同意,我认为是时候习惯(对我来说)有点冗长的语法了。谢谢你的好奇。我不知道为什么它不起作用,但我觉得它的可读性没有那么强。根据我的经验,您将编写如此多的模拟安装语句,以至于您会对语法感到舒适,并且厌倦了将所有内容提取到局部变量。@RyanBurbidge是的,我必须同意,我实际上是为了另一个It.IsAny()
,但为了解决问题,考虑使用一个更简单的示例。但尽管如此,我同意,我认为是时候习惯(对我来说)有点冗长的语法了。再次感谢你,我没能通过谷歌在不同的帖子中找到答案。。。谢谢你的解释和对Q&a的引用,我又一次没能通过谷歌在不同的帖子中找到答案。。。Thx用于解释和参考Q&A