使用yield为方法添加逻辑

时间:2015-03-12 16:12:44

标签: c# unit-testing yield-return

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

以下是代码:

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;
                }
            }
        }
    }

失败的单元测试声称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());
    }

当我制作本地副本(List)时,此测试已经通过,但是现在我正在使用yield,看来我无法在此方法中进行任何函数调用?谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

该行&#34; sut.GetTypes(null)&#34;只返回你丢弃的IEnumerable。由于您从不迭代可枚举,因此GetTypes中的所有代码都不会执行。

请改为尝试:

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