次のような単体テスト(MSTestを使用)があります。
[TestMethod]
public void MyTest()
{
var viewModel = new MyViewModel();
viewModel.Run();
//Assert something here
}
Run は void を返す非同期メソッドです。
Run
次のように実装されているとしましょう:
public async void Run()
{
//Show a busy indicator here
try
{
var result = await myAsyncModelClass.LongRunningOperation();
//Use the results here
}
finally
{
//Hide the busy indicator here
}
}
myAsyncModelClass.LongRunningOperation()
、それ自体は非同期メソッドでTask<T>
あり、T は ViewModel が関心のある結果です。
私の問題は、テストがメソッドを非同期で実行しているため、メソッドが完了Run
する前にアサーションが呼び出されることです。Run
アサーションが失敗するため、ブレークポイントを設定しても、最終ブロックに到達しないのは奇妙です。Run
メソッドを単体テストできるように同期を維持するにはどうすればよいですか?
の単体テストもありますが、タスクを返すのmyAsyncModelClass.LongRunningOperation()
で呼び出すだけです。Task<T>.Wait()
これにより、単体テスト時に同期が行われます。
また、言及したいのはRun()
、MVVM フレームワークによって魔法のように ICommand によって呼び出されることです。 void
戻り型が必要な場合とそうでない場合があるため、試してみる必要があります。