2012-02-16 35 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