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);
試行錯誤した結果たどり着いたものなので、もっといい方法があるという人は教えてください!!