Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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# 使用yield向方法添加逻辑_C#_Unit Testing_Yield Return - Fatal编程技术网

C# 使用yield向方法添加逻辑

C# 使用yield向方法添加逻辑,c#,unit-testing,yield-return,C#,Unit Testing,Yield Return,我试图使用yield命令来更新一些方法,但是我遇到了一个我不理解的问题。在这个方法中有一些逻辑(检查null的类型),如果是这种情况,那么我将写入日志并产生中断。这正是我想要的,但是在我的单元测试中,它说log函数从未被调用。我可以不在这种情况下登录,但我想知道为什么我不能,或者我是否做错了什么 代码如下: public IEnumerable<Ixxx> GetTypes(Type type) { if (type == null) {

我试图使用yield命令来更新一些方法,但是我遇到了一个我不理解的问题。在这个方法中有一些逻辑(检查null的类型),如果是这种情况,那么我将写入日志并产生中断。这正是我想要的,但是在我的单元测试中,它说log函数从未被调用。我可以不在这种情况下登录,但我想知道为什么我不能,或者我是否做错了什么

代码如下:

public IEnumerable<Ixxx> GetTypes(Type type)
    {
        if (type == null)
        {
            log.WriteRecord("log error", "LogName", true);
            yield break;
        }

        lock (blockingObject)
        {
            foreach (Ixxx item in aDictionary.Values)
            {
                if (item.Type.Name == type.Name)
                {
                    yield return item;
                }
            }
        }
    }
public IEnumerable GetTypes(类型)
{
if(type==null)
{
WriteRecord(“日志错误”,“日志名”,true);
屈服断裂;
}
锁定(阻塞对象)
{
foreach(字典值中的Ixxx项)
{
if(item.Type.Name==Type.Name)
{
收益回报项目;
}
}
}
}
失败的单元测试声称从未调用log.WriteRecord。下面是单元测试:

[TestMethod]
    public void TestMethod()
    {
        // Arrange
        mockLog.Setup(a => a.WriteRecord(It.IsAny<string>(), It.IsAny<string>(), true)).Returns(true);

        // Act
        sut.GetTypes(null);

        // Assert
        mockLog.Verify(a => a.WriteRecord(It.IsAny<string>(), It.IsAny<string>(), true), Times.Once());
    }
[TestMethod]
公共void TestMethod()
{
//安排
Setup(a=>a.WriteRecord(It.IsAny(),It.IsAny(),true)).Returns(true);
//表演
sut.GetTypes(null);
//断言
验证(a=>a.WriteRecord(It.IsAny(),It.IsAny(),true),Times.Once());
}
当我制作一个本地副本(列表)时,这个测试通过了,但是现在我使用的是yield,似乎我不能在这个方法中进行任何函数调用?谢谢你的帮助

行“sut.GetTypes(null)”只返回一个要丢弃的IEnumerable。由于您从未对可枚举项进行迭代,因此GetTypes中的任何代码都不会执行

请尝试以下方法:

foreach (var x in sut.GetTypes(null)) {}
行“sut.GetTypes(null)”只返回一个要丢弃的IEnumerable。由于您从未对可枚举项进行迭代,因此GetTypes中的任何代码都不会执行

请尝试以下方法:

foreach (var x in sut.GetTypes(null)) {}
行“sut.GetTypes(null)”只返回一个要丢弃的IEnumerable。由于您从未对可枚举项进行迭代,因此GetTypes中的任何代码都不会执行

请尝试以下方法:

foreach (var x in sut.GetTypes(null)) {}
行“sut.GetTypes(null)”只返回一个要丢弃的IEnumerable。由于您从未对可枚举项进行迭代,因此GetTypes中的任何代码都不会执行

请尝试以下方法:

foreach (var x in sut.GetTypes(null)) {}


您的设置是针对和重载
WriteRecord(string,string,true)
,但在您的方法中,您调用了重载
WriteRecord(string)
。添加
yield
时是否更改了调用的重载?此外,还需要使用
mockLog.setup(a=>…).Returns(true).verifiable()使设置可验证使用包含收益率回报的锁是非常危险的,很容易导致死锁模拟是好的,这是我搞砸的。我试图让它有更少的“敏感”信息,所以我删除了一些参数,忘记了它需要它们。很抱歉造成混淆也要感谢锁上的提示,我不确定您的设置是否会产生什么副作用以及
WriteRecord(string,string,true)
的重载,但是在您的方法中,您调用了
WriteRecord(string)
的重载。添加
yield
时是否更改了调用的重载?此外,还需要使用
mockLog.setup(a=>…).Returns(true).verifiable()使设置可验证使用包含收益率回报的锁是非常危险的,很容易导致死锁模拟是好的,这是我搞砸的。我试图让它有更少的“敏感”信息,所以我删除了一些参数,忘记了它需要它们。很抱歉造成混淆也要感谢锁上的提示,我不确定您的设置是否会产生什么副作用以及
WriteRecord(string,string,true)
的重载,但是在您的方法中,您调用了
WriteRecord(string)
的重载。添加
yield
时是否更改了调用的重载?此外,还需要使用
mockLog.setup(a=>…).Returns(true).verifiable()使设置可验证使用包含收益率回报的锁是非常危险的,很容易导致死锁模拟是好的,这是我搞砸的。我试图让它有更少的“敏感”信息,所以我删除了一些参数,忘记了它需要它们。很抱歉造成混淆也要感谢锁上的提示,我不确定您的设置是否会产生什么副作用以及
WriteRecord(string,string,true)
的重载,但是在您的方法中,您调用了
WriteRecord(string)
的重载。添加
yield
时是否更改了调用的重载?此外,还需要使用
mockLog.setup(a=>…).Returns(true).verifiable()使设置可验证使用包含收益率回报的锁是非常危险的,很容易导致死锁模拟是好的,这是我搞砸的。我试图让它有更少的“敏感”信息,所以我删除了一些参数,忘记了它需要它们。很抱歉搞砸了,也谢谢你提醒我锁上了,我不知道这会有什么副作用。人们在不知道关键词背后的概念的情况下使用关键词。。。这被称为“延迟执行”。人们在不知道关键词背后的概念的情况下使用关键词。。。这被称为“延迟执行”。人们在不知道关键词背后的概念的情况下使用关键词。。。这被称为“延迟执行”。人们在不知道关键词背后的概念的情况下使用关键词。。。它被称为“延迟执行”