2012-02-16 9 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も使用されて別のタイプの例外が作成されます。 しかし、最初のアプリケーションは動作しているようです。

2つのテストを1つずつ実行すると、正常に動作します。 しかし、それらを順番に実行すると、2番目のものが失敗します。

誰でもテスト終了後、アプリケーションを正しくシャットダウンする方法はありますか?

次の方法でアプリケーションをシャットダウンしようとしましたが、動作しません。

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); 
} 

そして、これが私のアプリケーションクラスです:

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()'の呼び出しを見ません - あなたは何かを残しましたか? –

+0

私が実行しているようだと言っている理由は、2回目のテストを実行すると、1回目のテストでテストランナーを起動するのではなく、順番に実行すると失敗しますテストランナーを2回目のテストのために開始して、これを確認すること。 –

答えて

0

Applicationクラスは、複数のApplicationのインスタンス(または任意のサブクラス)がAppDomainごとに作成することはできません。これは、Applicationがまだ実行中であるかどうかにかかわらずです。 MSDNから:

アプリケーションはそのウィンドウ、プロパティ、およびリソーススコープサービスへの共有アクセス を提供するために、シングルトンパターンを実装します。その結果、 アプリケーションクラスのインスタンスは、 AppDomainごとに1つしか作成できません。

これを回避するには、それぞれのテストでAppDomainを作成することができます。

+0

ありがとう、ケント。ここで私の質問を投稿する前にAppDomainsをチェックしましたが、シンプルでIIS用ではない例は見つかりません。私は、各テストのAppDomainの作成方法と、テスト内での使用方法を見つけられませんでした。 –

関連する問題