IEnumerable和yield return

时间:2010-01-21 20:03:42

标签: c# unit-testing generics nunit mstest

当我调用泛型基类型的方法时,我的单元测试正在做一些非常奇怪的事情。我已经尝试了NUnit和MSTest同样的结果。这就是代码的组织方式:

public class MyStub {}

public class EnumerableGenerator
{
     public bool GotMyStubs;

     public IEnumerable<MyStub> GetMyStubs()
     {
         GotMyStubs = true;
         yield return new MyStub();
     }
}
public class ConsoleRunner
{
public void Main(string args[])
{
     EnumerableGenerator gen = new EnumerableGenerator();
     gen.GotMyStubs = false;
     var myStubs = gen.GetMyStubs();
     if  (!gen.GotMyStubs)
         return 1;
} 
}

测试显然失败了。奇怪的是,当我进行集成测试时,代码运行正常。它只在单元测试中中断。我根本无法进入GetMyStubs。方法中的断点也不会中断。我已经开始打破CLR抛出的所有异常,这也没有产生任何结果。

我检查了GetMyStubs返回的类型,类型的全名如下:

[MyNamespace.EnumerableGenerator2 + <GetMyStubs> d__8 [[MyNamespace.MyStub,MyNamespace,Version = 7.1.0.0,Culture = neutral,PublicKeyToken = null]]

现在,当我查看我的代码覆盖率数字(通过MSTest)时,我注意到有一个EnumerableGenerator.d__8条目。

有没有人见过这样的东西?我完全失去了......

1 个答案:

答案 0 :(得分:3)

您提供的代码甚至无法编译 - Count上没有IEnumerable<T>属性。有一个Count() 扩展方法 - 这是你的意思吗?

我强烈怀疑MyMethod() 我怀疑它实际上使用yield return来返回项目...此时类型的全名是有意义的,因为它是迭代器块为您生成的状态机。

假设是这种情况,当您致电MyMethod()时,不会执行任何代码。它将创建状态机并将其返回。当你开始迭代它时,然后它将开始执行你的代码...那就是我希望破坏点被击中的时候。

你能否提供一个简短但完整的例子(如果有必要,使用NUnit,但控制台应用程序是理想的)它会失败吗?