繁体   English   中英

IEnumerable和收益回报

[英]IEnumerable and yield return

当我调用通用基本类型的方法时,单元测试做的事情很奇怪。 我已经尝试了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条目。

有人看到过这样的东西吗? 我完全迷路了...

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

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

假设是这种情况,当您调用MyMethod()时,将不会执行任何代码。 它将创建状态机并返回它。 当你开始遍历它, 然后它会开始执行代码......这时候,我期望被打破发点。

您能否提供一个简短但完整的示例(如果需要,可以使用NUnit,但最好使用控制台应用程序)失败了吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM