2013-06-28 163 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的等價物。