[英]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.