かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

非同期処理を含むメソッドの単体テスト方法

Reactive Extensionsを使うと簡単に非同期処理を書くことが出来るのですが、単体テストをしようとすると非同期処理って非常にテストしづらいです・・・。
例えば以下のようなパターン

var target = new TestTargetObject();
target.GetHogehoge(); // 例えばWebから何かとってくるとか

// うまく動けば1件とれるはずなんだけど・・・
Assert.AreEquals(1, target.HogehogeResults.Count);

GetHogehogeの内部は、非同期の処理が行われるのでAreEqualsのタイミングでは、まだバックグラウンドで処理がはしってる途中なので、結果をアサーションにかけることは出来ません。
ということで、こういうケースで100%うまくいくのか確証はないのですが今の所うまく動いてる方法をメモしておきます。

var target = new TestTargetObject();
target.GetHogehoge(); // 例えばWebから何かとってくるとか

// 完了まで待つわ
Dispatcher.CurrentDispatcher.Invoke(
    new Action(() => { }),
    DispatcherPriority.Background);

// 非同期処理が終わってるのでちゃんと結果をアサーションできる
Assert.AreEquals(1, target.HogehogeResults.Count);

試行錯誤した結果たどり着いたものなので、もっといい方法があるという人は教えてください!!