2013-06-28 166 views
3

ReSharper的我有一个奇怪的问题出现,当我运行VS2012我的单元测试。我正在使用NUnit并使用ReSharper运行它们,并且所有测试都在运行。但是,当我的同事们进行的测试,他们中的一些不那么他们所使用的测试资源管理器与扩展NUnit测试适配器(Beta 3中)v0.95.2http://visualstudiogallery.msdn.microsoft.com/6ab922d0-21c0-4f06-ab5f-4ecd1fe7175d)有ReSharper的。然而,有了这个扩展,一些测试失败了。单元测试失败,NUnit测试适配器,但不与VS2012

失败的具体代码如下:

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) 

现在,我不是寻找一个回答为什么我得到这个例外,当然我可以理解为什么它失败了。但我不明白为什么测试失败与测试Exporer但不是使用ReSharper时。为什么我会得到不同的测试行为?

我用程序Ildasm.exe以查看是否为两种情况下进行测试时的代码被编译以不同,但​​IL-代码是相同的。

测试也运行期间提交我们没有任何错误团队市的服务器上。

此外,调试测试时,我通过NUnit测试适配器进行调试时,但在调试的时候,并通过与ReSharper的,也不例外,在所有的代码步进得到相同的异常。

+0

其中该码是从叫什么名字? TestMethod,SetUp,构造函数? – citizenmatt

+0

从TestMethod的,当我在“演戏”的单元测试。 –

+0

我看不出为什么会失败。你能得到一个我可以下载并看看的repro项目吗?把它放在要点上,或者什么? – citizenmatt

回答

1

我发现,在VS2012类似的代码会在运行时失败,同样的错误。如果您在应用程序中使用此方法,它会成功吗?

你是一个集合,并从中删除项目,而你还在集合中的功能迭代 - 这改变集合的内部索引,无效迭代的寻址。如果您将其编码为:

for(int I=0; I < Items.Count, I++) 
{ 
    removeItem(Items[I]); 
} 

由于集合的内部索引重置,您会发现索引超出范围错误。

我无法与ReSharper交谈,但我猜测它有比MS nunit引擎更好的运行时引擎(或者,对于MS运行时引擎)。

我是做在我试图通过依赖对象的集合在我父迭代和删除应用程序类似的东西。它失败,您收到确切的错误:最终我用LINQ查询去去除附着在指定的父所有项目 - 在运行SQL查询DELETE FROM table WHERE parentID = parentid的等价物。