1

我有一个静态类,它包含像UnhandledExceptionProcessExit(CurrentAppDomain 对象的)这样的.NET 事件,因此当调用者在类上调用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 回答