我在 VS2012 中运行单元测试时出现了一个奇怪的问题。我正在使用 NUnit 并使用 ReSharper 运行它们,并且所有测试都在工作。但是当我的同事运行测试时,他们中的一些人没有 ReSharper,因此他们使用带有扩展NUnit 测试适配器(Beta 3)v0.95.2的测试资源管理器(http://visualstudiogallery.msdn.microsoft.com/6ab922d0 -21c0-4f06-ab5f-4ecd1fe7175d)。然而,随着那个扩展,一些测试失败了。
失败的具体代码如下:
public void Clear()
{
this.Items.ForEach(s => removeItem(s));
}
private bool removeItem(SequenceFlow item)
{
int i = this.Items.IndexOf(item);
if (i == -1)
return false;
this.Items.RemoveAt(i);
return true;
}
例外是:
System.InvalidOperationException : Collection was modified; enumeration operation may not execute.
Result StackTrace:
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.ForEach(Action`1 action)
现在,我不是在寻找答案来回答为什么会出现此异常,当然我可以理解它为什么会失败。但我无法理解的是,为什么使用 Test Exporer 时测试失败,而使用 ReSharper 时却没有。为什么我会在测试中得到不同的行为?
我使用 ildasm.exe 来查看在测试这两种情况时代码是否编译不同,但 IL 代码是相同的。
测试还在我们的 Team City 服务器上提交期间运行,没有错误。
此外,在调试测试时,我在通过 NUnit 测试适配器进行调试时遇到了相同的异常,但是在使用 ReSharper 调试和单步执行代码时,根本没有异常。