かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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

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

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