2011-11-22 9 views
0

私はプロジェクトでRx、より具体的にはReactiveUIをしばらく使用していましたが、何かアドバイスが必要な状況に陥っています。ReactiveUI MessageBusとMessageBoxの結果が

問題は、コマンドが実行されたとき(ボタンがクリックされたとき)、ユーザーが「はい」または「いいえ」と答えるメッセージボックスを表示することです。答えに応じて、もの。ユニットテストでMVVMを使用しているので、私はMessageBoxをテスト可能にしたいと思います。すなわち、他のコードに置き換えられる。これは基本的に私が持っているものです。私の見解モデルで

this.ExternalObservable = this.SomeOperationCommand 
      .SelectMany(_ => this.UserWantsToContinueWithOperation()) 
      .Where(x => x) 
      .Select(_ => this.SomeData) 
      .Where(x => x != null); 

private IObservable<bool> UserWantsToContinueWithOperation() { 
     var subject = new Subject<bool>(); 

     var box = new GuiMsgBox("Continue?", 
      result => { 
       subject.OnNext(result == System.Windows.MessageBoxResult.Yes); 
      }); 

     MessageBus.Current.SendMessage(box); 

     return subject; 
    } 

そしてGuiMsgBoxは、基本的に私はUIで、私のテストでMessageBusを使用して耳を傾けるSystem.Windows.MessageBoxクラスのラッパーです。

アプリケーションを実行しているときに、このすべてが正常に動作しますが、ユニットテストでは、バスがイミディエイトスケジューラを使用しているため、明らかに同じ方法では動作しません。

私はここにいくつかのデザイングリッジがあると感じています。したがって、実際の問題の入力はありません。テストすることができる結果を返すメッセージボックスを表示するには、非常に感謝します!

答えて

1

詳細な実装の詳細がわからないのは難しいですが、代わりにTestSchedulerを使用することを検討します。 RxUI.Testingでは、これは同じように簡単です:

(new TestScheduler()).With(sched => { 
    // Write your test here, all the schedulers will be 
    // implicitly set to your 'sched' scheduler. 
}); 

は、ここでポモドーロタイマーをテストし、MVVM関連のテストの束の例です:

https://github.com/xpaulbettsx/ReactiveUI/blob/master/ReactiveUI.Sample/ReactiveUI.Sample.Tests/ViewModels/BlockTimerViewModelTest.cs

ここMVVMの別の良い例です入力を模擬するために、具体的CreateColdObservableを使用してベースのテストfrom my Rx book(プラグについて申し訳ありません)、

を(すなわち、「10秒待って、ボタンをクリックし、チェック結果」のシナリオをテスト) 0

+0

良いアイデアは、私はこの特定の問題の 'TestScheduler'を試してみます。ダイアログボックスから結果を取得する方法について、他に何をお考えですか? ReactiveUIを使用しているときはどうしますか?私は、即時の代わりに延期されている 'MessageBus'まで沸騰していると思います。 MVVMLight、そうじゃない? – lbergnehr

関連する問題