3

VS2012 で単体テストを実行すると、奇妙な問題が発生します。私は NUnit を使用しており、それらを ReSharper で実行しています。すべてのテストが機能しています。しかし、同僚がテストを実行するとき、一部の同僚は ReSharper を持っていないため、拡張機能NUnit Test Adapter (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 を使用して、2 つのケースをテストするときにコードのコンパイルが異なるかどうかを確認しましたが、IL コードは同じです。

テストは、Team City サーバーでのコミット中にもエラーなしで実行されます。

さらに、テストをデバッグするときに、NUnit テスト アダプターを介してデバッグするときに同じ例外が発生しますが、ReSharper を使用してコードをデバッグおよびステップ実行すると、例外はまったく発生しません。

4

1 に答える 1

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

于 2013-07-02T17:05:49.260 に答える