私の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;
}
//....
}
"実行中のようです"とは何ですか?私の最初の考えは、アプリケーションを開始したことがないので、ディスパッチャーをポンピングするものは何もありませんでした。私は上記のあなたのコードのどこにでも 'Run()'の呼び出しを見ません - あなたは何かを残しましたか? –
私が実行しているようだと言っている理由は、2回目のテストを実行すると、1回目のテストでテストランナーを起動するのではなく、順番に実行すると失敗しますテストランナーを2回目のテストのために開始して、これを確認すること。 –