1

UnhandledException(CurrentAppDomain オブジェクトの) and などの.NET イベントをラップする静的クラスがあるProcessExitため、呼び出し元がクラスでInitializeを呼び出すと、これらのイベントの独自のハンドラーがサブスクライブされ、後で呼び出し元が独自のハンドラーを追加できます。メソッド、専用の API を使用します。(そのように設計されているため、イベントが発生したときにハンドラーの実行順序を制御できます)。

私の質問は次のとおりです。そのようなクラスを単体テストすることは可能ですか?

たとえば、未処理の例外がスローされたときに、プライベート ハンドラーが実行されたことを知りたいと思います。問題は、未処理の例外をスローすると、それがテストの「結果」になることです(間違っている場合は修正してください)。プロセスを終了すると、同じシナリオが発生します。

考えられる解決策には、新しいアプリ ドメインの読み込みが含まれる可能性があると考えていましたが、それが可能かどうか、技術的にどのようにアプローチするかはわかりません。

4

1 に答える 1

0

テストUnhandledExceptionするには、新しいスレッドで例外をスローできます。

[TestMethod]
public void UnhandledTest()
{
    using (var okEvent = new ManualResetEventSlim())
    using (var notOkEvent = new ManualResetEventSlim())
    {
        UnhandledExceptionEventHandler handler = (o, e) =>
            {
                if (e.ExceptionObject is ApplicationException)
                    okEvent.Set();
                else notOkEvent.Set();
            };

        AppDomain.CurrentDomain.UnhandledException += handler;

        var thread = new Thread(() => { throw new ApplicationException(); });
        thread.Start();

        var result = EventWaitHandle.WaitAny(new[] { notOkEvent.WaitHandle, okEvent.WaitHandle }, 10000);
        Assert.AreEqual(1, result);

        AppDomain.CurrentDomain.UnhandledException -= handler;
    }
}

テスト フレームワークは、テスト メソッドを実行するスレッドでのみ例外をキャッチするため、これによってテストが失敗することはありません。

ProcessExit一方、現在のプロセスが終了するときに発生するため、それまでにテスト フレームワークがシャットダウンしている可能性が非常に高くなります。そのため、実際のテスト コードを別のプロセスで実行する必要があります。単体テスト メソッドから新しいプロセスを開始し、テストの要点を実行して、元のプロセスの単体テスト メソッドにテストの結果を伝えます。

新しいプロセスは、単に個別の .exe プロジェクトです。にアタッチしProcessExit、それ自体を停止し、ProcessExitハンドラーですべてが正常に機能していることを確認してから、単体テスト メソッドを実行しているプロセスに結果を返します。

コマンド ラインを使用して単体テスト プロジェクトから .exe プロジェクトへの通信を行い、一時ファイルや名前付きイベントなどの何らかの IPC を使用して通信を戻すことができます。

于 2013-01-29T08:51:40.370 に答える