对话框中的异常导致MSTest崩溃

时间:2017-07-25 12:15:40

标签: c# .net unit-testing mstest

我在我们的应用程序中研究了一些行为,并进行了一次测试,始终使测试引擎崩溃。我将测试代码简化为:

[TestMethod, Timeout(2000)]
public void ShowDialogShouldCleanupAfterException()
{
    var topWindow = new Window();

    topWindow.Loaded += (sender, args) =>
    {
        var childWindow = new Window();
        childWindow.Loaded += (o, eventArgs) =>
        {
            throw new Exception("ChildWindowException");
        };

        childWindow.ShowDialog();
        topWindow.Close();
    };

    topWindow.ShowDialog();
}

每次运行此代码时,都会弹出一个对话框,告诉我vstest.executionengine.exe已停止工作。为什么会发生这种情况,我可以做些什么来确保测试在这种情况下继续运行?

修改

WPF示例应用程序中出现类似行为:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var childWindow = new Window();
        childWindow.Loaded += ChildWindow_Loaded;
        childWindow.Owner = this;
        try
        {
            childWindow.ShowDialog();
        }
        catch (Exception)
        {
            MessageBox.Show("Exception caught");
        }
    }

    private void ChildWindow_Loaded(object sender, RoutedEventArgs e)
    {
        throw new NotImplementedException();
    }
...

我理解这段代码有问题。在子对话框中捕获异常将解决此问题。但我只是想了解它为什么会这样。

1 个答案:

答案 0 :(得分:0)

好的,我最终发现了为什么会发生这种情况以及在我的应用程序中解决它的方法。

需要在该调度程序上处理在不同调度程序中发生的异常。异常在堆栈中冒泡。调用ShowDialog后,将启动子对话框的堆栈。因此,在该对话框中发生的任何异常都不会被调用代码的try / catch捕获。需要专门处理这些异常。

In this question about handling exceptions in wpf,我发现我可以使用以下代码处理这些异常:

childWindow.Dispatcher.UnhandledException += (o, eventArgs) =>
{
   // handling code...
    eventArgs.Handled = true;
};

这就是我理解它的方式。如果我错了,请纠正我!