Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分配它。IsAny<&燃气轮机;到本地var不起作用?_C#_Tdd_Moq - Fatal编程技术网

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