テスト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 を使用して通信を戻すことができます。