我正在尝试使用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,看来我无法在此方法中进行任何函数调用?谢谢你的帮助!
答案 0 :(得分:3)
该行&#34; sut.GetTypes(null)&#34;只返回你丢弃的IEnumerable。由于您从不迭代可枚举,因此GetTypes中的所有代码都不会执行。
请改为尝试:
foreach (var x in sut.GetTypes(null)) {}