C# 单元测试.NET事件调用
我有一个围绕.NET事件的静态类,如C# 单元测试.NET事件调用,c#,unit-testing,unhandled-exception,C#,Unit Testing,Unhandled Exception,我有一个围绕.NET事件的静态类,如UnhandledException和ProcessExit(CurrentAppDomain对象),这样当调用方调用该类进行初始化时,它会为这些事件订阅我自己的处理程序,然后调用方可以使用专用API添加自己的处理程序方法。 (它是这样设计的,因此我能够在事件触发后控制处理程序的执行顺序) 我的问题是:有可能对这样一个类进行单元测试吗 例如,我想知道,当抛出未处理的异常时,我的私有处理程序已经执行。问题是,当我抛出未处理的异常时,这将是测试的“结果”(如果我错
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的说明。如果您觉得我的回答是可以的,那么请将其标记为对您的问题的回答。嗯,我不确定我是否希望实施测试来启动另一个流程,然后启动一个通信流程,因为在我看来,它似乎超出了单元测试的目的。尽管如此,你的回答还是帮了我很大的忙,只是知道我没有错过任何特殊待遇。非常感谢:)