2012-02-16 26 views
1

我的WPF应用程序有一个App类,它从System.Windows.Application继承。测试应用程序类不会在测试完成后关闭应用程序

在这个类的内部,我有处理DispatcherUnhandledException的异常处理,因此任何未处理的异常都可能被捕获并呈现给用户。

为了验证这一点,我开始了我的测试与

//Arrange 
app = new App(); 

,然后我继续测试设置的其余部分。

后来在我的测试运行此代码:

//Act 
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new MyDlg(RaiseArgumentNullException)); 

这触发了App类要执行ApplicationStartup。

当我的下一个测试开始时,它也创建一个新的App类,并使用CurrentDispatcher.Invoke创建另一种类型的异常。 但是,第一个应用程序似乎正在运行。

如果我一个一个地运行我的两个测试,他们工作得很好。 但如果我顺序运行它们,第二个失败。

有没有人有任何想法如何在测试完成后正确关闭应用程序?

我试过以下方法关闭应用程序,但它不起作用。

static void CloseApp() 
{ 
    Application.Current.Shutdown(); 
} 

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Send, new MyDlg(CloseApp)); 
app.Shutdown(); 
Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Send); 

这是我的代码看起来像: 委托无效MyDlg();

static void RaiseArgumentNullException() 
{ 
    throw new ArgumentNullException(); 
} 

[Test] 
public void MyTest() 
{ 
    //Arrange 
    app = new App(); 
    //... 

    //Act 
    Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new MyDlg(RaiseArgumentNullException)); 

    //Assert.... 

    //Tear Down 
    Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Send, new MyDlg(CloseApp)); 
    app.Shutdown(); 
    Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Send); 
} 

这是我的App类:

public partial class App : Application 
{ 
    public App() 
    { 
     Startup += ApplicationStartup; 
     DispatcherUnhandledException += AppDispatcherUnhandledException; 
     Bootstrapper.InitializeIoc(); 
    } 

    private void ApplicationStartup(object sender, StartupEventArgs e) 
    { 
     //Do startup stuff 
    } 

    void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     HandleException(e.Exception); 
     e.Handled = true; 
    } 
//.... 
} 
+0

是什么让你说它“似乎在跑步”?我最初的想法是,你没有开始申请,因此没有任何东西可以抽调它的调度员。我在上面的代码的任何地方都看不到'Run()'的调用 - 是否遗漏了一些东西? – 2012-02-16 10:19:57

+0

我之所以说它似乎正在运行,是因为当我运行第二次测试时,如果我按顺序运行它们而不是启动测试运行器(我使用resharper进行第一次测试),验证失败结果,然后启动测试跑步者进行第二次测试并验证它。 – 2012-02-16 11:42:46

回答

0

Application类不允许超过每AppDomain要创建的Application一个实例(或任何子类)。这与Application是否仍在运行无关。从MSDN

应用实现Singleton模式,以提供其窗口,财产和资源范围的服务共享访问 。因此,根据 AppDomain,只能创建一个Application类实例。

要解决这个问题,您可以在每个测试中创建一个AppDomain

+0

谢谢Kent。我在这里发布我的问题之前检查了AppDomains,但我无法找到任何简单且不适用于IIS的示例。我只是没有找到如何为每个测试创建一个AppDomain,以及如何在测试中使用它。 – 2012-02-16 11:39:02