かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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

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

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