Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试.NET事件调用_C#_Unit Testing_Unhandled Exception - Fatal编程技术网

C# 单元测试.NET事件调用

C# 单元测试.NET事件调用,c#,unit-testing,unhandled-exception,C#,Unit Testing,Unhandled Exception,我有一个围绕.NET事件的静态类,如UnhandledException和ProcessExit(CurrentAppDomain对象),这样当调用方调用该类进行初始化时,它会为这些事件订阅我自己的处理程序,然后调用方可以使用专用API添加自己的处理程序方法。 (它是这样设计的,因此我能够在事件触发后控制处理程序的执行顺序) 我的问题是:有可能对这样一个类进行单元测试吗 例如,我想知道,当抛出未处理的异常时,我的私有处理程序已经执行。问题是,当我抛出未处理的异常时,这将是测试的“结果”(如果我错

我有一个围绕.NET事件的静态类,如
UnhandledException
ProcessExit
(CurrentAppDomain对象),这样当调用方调用该类进行初始化时,它会为这些事件订阅我自己的处理程序,然后调用方可以使用专用API添加自己的处理程序方法。 (它是这样设计的,因此我能够在事件触发后控制处理程序的执行顺序)

我的问题是:有可能对这样一个类进行单元测试吗

例如,我想知道,当抛出未处理的异常时,我的私有处理程序已经执行。问题是,当我抛出未处理的异常时,这将是测试的“结果”(如果我错了,请纠正我)。 如果我退出流程,同样的情况也会发生


我在想一个可能的解决方案可能包括加载一个新的应用程序域,尽管我不知道这是否可行,以及如何从技术上实现这一点。

要测试
未处理的异常
可以在新线程中抛出异常:

[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进行通信,如临时文件或。

thanx@stefan,这就解决了一个问题。(尽管我仍然很乐意得到一个解释,说明在另一个线程上抛出未处理的异常后,测试为什么不会崩溃,这是常规的应用程序行为)。您知道如何测试ProcessExit事件吗?我编辑了答案并添加了一个关于如何测试ProcessExit的说明。如果您觉得我的回答是可以的,那么请将其标记为对您的问题的回答。嗯,我不确定我是否希望实施测试来启动另一个流程,然后启动一个通信流程,因为在我看来,它似乎超出了单元测试的目的。尽管如此,你的回答还是帮了我很大的忙,只是知道我没有错过任何特殊待遇。非常感谢:)