【问题标题】:IEnumerable and yield returnIEnumerable 和收益率回报
【发布时间】:2010-01-21 20:03:41
【问题描述】:

当我调用泛型基类型的方法时,我的单元测试做了一些非常奇怪的事情。我已经尝试过 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+&lt;GetMyStubs&gt;d__8[[MyNamespace.MyStub, MyNamespace, Version=7.1.0.0, Culture=neutral, PublicKeyToken=null]]

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

有人见过这样的吗?我完全迷路了......

【问题讨论】:

标签: c# unit-testing generics nunit mstest


【解决方案1】:

您给出的代码甚至无法编译 - IEnumerable&lt;T&gt; 上没有 Count 属性。有一个Count() 扩展方法 - 你是这个意思吗?

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

假设是这种情况,当您调用MyMethod() 时,它不会执行您的任何代码。它将创建状态机并返回它。当您开始对其进行迭代时,然后它将开始执行您的代码...我希望此时会遇到断点。

您能否提供一个简短但完整的示例(必要时使用 NUnit,但最好使用控制台应用)?

【讨论】:

  • 是的,您对扩展方法是正确的。这就是我的意思。再一次,你对收益率的看法是正确的。我今天肯定学到了一些东西。我将更新上面的示例以更清楚地说明代码。
猜你喜欢
  • 2018-01-23
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多