2017-07-03 15 views
0

私のWPFプログラムのワークフローを実行するいくつかのテストがあります。通常のMVVMアプローチは、ビューのボタンをビューモデル上のコマンドにバインドし、イベントを処理します。私のテストが私のワークフローをテストする方法は、ビューモデル上でコマンドを直接実行することです。このすべては、コマンドを処理するのviewmodelのコードが、これは単なるイベントハンドラなるので非同期voidメソッドされて終わるという事実を除いて、うまく機能NUnitで非同期voidメソッドの例外を処理する方法

[Test] 
public void Test() 
{ 
    var vm = new ViewModel(); 
    vm.AcceptCommand.Execute(); 
    Assert.IsTrue(stuff); 
} 

:これはおおよそのようなものを見て変換します。ここに例外がスローされると、nunitはバックグラウンドスレッドでこの例外を "認識"しないため、失敗したテストを表示しません。

私の質問です:これらのバックグラウンド例外を処理するNUnitを取得する方法はありますか?

答えて

0

asyncメソッド内での例外を検証するNUnitで別の方法があります:

var exception = Assert.ThrowsAsync<NotImplementedException>(() => vm.AcceptCommand.Execute()); 

またはその逆は:

Assert.DoesNotThrowAsync(() => vm.AcceptCommand.Execute()); 
+0

をイベントハンドラが非同期無効であるため、例外がテスト中に別のメソッドを呼び出すと、私の場合はNUnitのコンテキスト – ptsoccer

1

それが可能だ場合は、2つの方法にあなたの方法をリファクタリング。最初はTaskを返すべきであり、それはテスト可能なものです。もう1人はを呼び出し、の最初の方法を待つ必要があります。 このヒントは、C#CookbookのConcurrencyからStephen Clearyによって作成されたものです。これが好ましい方法です。この本には、async voidメソッドをテストできるようにするAsyncEx libraryのAsyncContextクラスも記載されています。同じ本から

AsyncContext.Run(() => 
{ 
    // put your code here 
}) 

引用:AsyncContextタイプは(非同期無効メソッドを含む)完全なすべての非同期操作をするまで待機しますと、彼らは上げる例外を伝播します。

同様の議論についてはこちらをご覧ください:Await a Async Void method call for unit testing

+0

を「エスケープ」ので、これは私の場合には動作しません。私のテストの多くはより高いレベルで実行され、別のメソッドを呼び出すことはできないので(常に呼び出しを行うものではないため)、常に可能なわけではありません。私はまた、私(またはプロジェクトに取り組んでいる誰か)がこの特別なことをするのを忘れてはならないので、これは自動ではないという事実を嫌う。 AsyncContextは興味深いですが、私は次の機会にそれを調べます。 – ptsoccer