3

いくつかの単体テスト間で競合があります。私は静的イベントを持つクラスを持っています。各テストを一度に 1 つずつ実行すると問題はありませんが、すべてのテストをバッチで実行すると、イベントを起動しているテストは、登録されたリスナー (持っている) のためにクラッシュします。以前のテストでイベントに登録された)。

明らかに、テストされたクラスがイベントを発生させたときにイベントハンドラーを実行したくないので、最善の解決策は何ですか?

イベントが静的でなければ問題はないことはわかっていますが、別の解決策がある場合は、これを再設計する必要はありません。

テストを実行する前にすべてのイベントリスナーをデタッチすることは解決策になる可能性がありますが、クラスの外からそれを行うことは不可能だと思います (これは、クライアントが他のすべてのリスナーをデタッチできるようにしたくないという通常の理由のようです)。内部からそれを行うことは、単体テストの唯一の目的のためにクラスにメソッドを追加する必要があることを意味します。これは悪い習慣です。

他の以前のテストが影響を与えるのを防ぐ分離モードでテストを実行する方法はありますか? 静的イベントへの同じ参照を取得しないように、完全に分離されたプロセスで実行された場合のように? (ただし、クリックするだけですべてのテストをバッチで実行できる必要があります)

あなたの助けとアイデアをありがとう!

詳細については、Visual Studio 2012 単体テスト フレームワークを使用しています。

4

1 に答える 1

5

個々のテストのどこかで、自分自身を静的イベントに関連付けます。したがって、アサートの直前に、単に自分自身を切り離すか、finally ブロック内で切り離しをより適切に保護してください。

[TestCase]
public void MyTestDetachingBeforeAssert()
{
    bool finishedCalled = false;
    var eventListener = new EventHandler((sender, e) => finishedCalled = true);

        MyClass.Finished += eventListener;
        // Can lead to detach problems if this throws an exception!
        MyClass.DoSomething();
        MyClass.Finished -= eventListener;

        Assert.That(finishedCalled);
}

[TestCase]
public void MyTestDetachingInFinally()
{
    bool finishedCalled = false;
    var eventListener = new EventHandler((sender, e) => finishedCalled = true);

    try
    {
        MyClass.Finished += eventListener;
        MyClass.DoSomething();

        Assert.That(finishedCalled);
    }
    finally
    {
        MyClass.Finished -= eventListener;
    }
}
于 2013-04-12T13:55:12.567 に答える