测试完成后,测试Application类不会关闭应用程序

时间:2012-02-16 09:04:28

标签: c# .net wpf

我的WPF应用程序有一个App类,它继承自System.Windows.Application。

在这个类中,我有处理DispatcherUnhandledException的异常处理,因此可以捕获任何未处理的异常并将其呈现给用户。

为了测试这个,我用

开始测试
//Arrange
app = new App();

然后我继续进行其余的测试设置。

稍后在我的测试中我运行了这段代码:

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

这会触发ApplicationStartup在App类中执行。

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

如果我一个接一个地运行我的两个测试,它们的工作正常。 但如果按顺序运行它们,第二个就会失败。

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

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

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

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

这就是我的代码的样子:     委托void 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;
    }
//....
}

1 个答案:

答案 0 :(得分:0)

Application类不允许每ApplicationAppDomain(或任何子类)创建多个实例。这与Application是否仍在运行无关。来自MSDN

  

Application实现单例模式以提供共享访问   到它的窗口,属性和资源范围服务。所以,   每个只能创建一个Application类的实例   应用程序域。

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