要进行测试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(如临时文件或命名事件)进行通信。