2011-11-22 85 views
0

我一直在使用Rx和更具體ReactiveUI在項目中一段時間​​,自己也得到了進入的情況下,我想我需要一些建議的MessageBox。ReactiveUI MessageBus與結果

問題是,執行一個命令(單擊一個按鈕)時,我想顯示一個消息框,其中一個用戶將回答是或否。根據答案,然後我想再做一些東東。因爲我在單元測試中使用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基本上是圍繞System.Windows.MessageBox類我聽使用UI中的MessageBus,在我測試的包裝。

這一切都運行應用程序時,但在單元測試中,因爲公共汽車,然後使用即時調度工作正常,這顯然不工作方式相同。

我覺得有一些設計上的毛刺在這裏,所以對實際問題的任何輸入;顯示一個消息框,返回一個可以測試的結果,將不勝感激!

回答

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的另一個很好的例子基於測試from my Rx book(約插頭遺憾)中,爲了嘲笑輸入具體使用CreateColdObservable(即測試的情景「點擊按鈕,等待10秒,檢查結果」)

https://github.com/ProgRx/Chapter-9

+0

好主意,我會嘗試'TestScheduler'這個特殊的問題。對於從對話框中獲得結果的方式,您還有什麼想法?使用ReactiveUI時你怎麼做?我想可以歸結爲「MessageBus」被推遲而不是立即,這是例如。 MVVMLight,不是嗎? – lbergnehr