我在一个项目中使用 Rx,更具体地说是 ReactiveUI 已经有一段时间了,我觉得我需要一些建议。
问题是,如果执行了一个命令(单击了一个按钮),我想显示一个消息框,用户将回答是或否。根据答案,我想做更多的事情。当我将 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 和测试中使用的类的包装器System.Windows.MessageBox
。MessageBus
这在运行应用程序时一切正常,但在单元测试中,由于总线正在使用即时调度程序,显然它的工作方式不同。
我觉得这里有一些设计故障,所以对实际问题有任何意见;显示一个消息框,返回一个可以测试的结果,将不胜感激!