2017-07-25 34 views
0

我正在研究應用程序中的某些行爲,並進行了一貫使測試引擎崩潰的測試。我簡化了測試代碼到這一點:對話框中的例外導致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(); 
    } 
... 

我明白這段代碼有問題。捕捉子對話框中的異常將解決此問題。但我只是想明白爲什麼它的行爲如此。

+0

它經常發生歸因於遞歸調用。可能的重複https://stackoverflow.com/questions/40150167/vstest-crashed-when-running-some-particular-tests –

+2

我不希望測試運行者爲UI設置必要的基礎結構來運行。 –

+0

@Damien_The_Unbeliever,不錯的建議,但我的其他測試特色的UI組件只是工作,我在WPF應用程序中有類似的行爲。這就是我做這些不合理測試的原因。我在WPF應用程序中用這個例子編輯了我的問題。 – Martijn

回答

0

好吧,我最終發現了爲什麼會發生這種情況,並在我的應用程序中解決它的一種方法。

發生在另一個調度程序中的異常需要在該調度程序上處理。異常冒出了堆棧。子對話框的堆棧在ShowDialog被調用後開始。所以在該對話框中發生的任何異常都不會被調用代碼的try/catch所捕獲。這些例外需要特別處理。

In this question about handling exceptions in wpf,我發現我可以處理這些異常與下面的代碼:

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

這是我如何理解它。如果我錯了,請糾正我的錯誤!