2011-11-22 44 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