当我调用泛型基类型的方法时,我的单元测试正在做一些非常奇怪的事情。我已经尝试了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条目。
有没有人见过这样的东西?我完全失去了......
答案 0 :(得分:3)
您提供的代码甚至无法编译 - Count
上没有IEnumerable<T>
属性。有一个Count()
扩展方法 - 这是你的意思吗?
我强烈怀疑MyMethod()
我怀疑它实际上使用yield return
来返回项目...此时类型的全名是有意义的,因为它是迭代器块为您生成的状态机。
假设是这种情况,当您致电MyMethod()
时,不会执行任何代码。它将创建状态机并将其返回。当你开始迭代它时,然后它将开始执行你的代码...那就是我希望破坏点被击中的时候。
你能否提供一个简短但完整的例子(如果有必要,使用NUnit,但控制台应用程序是理想的)它会失败吗?