0

我在一个项目中使用 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.MessageBoxMessageBus

这在运行应用程序时一切正常,但在单元测试中,由于总线正在使用即时调度程序,显然它的工作方式不同。

我觉得这里有一些设计故障,所以对实际问题有任何意见;显示一个消息框,返回一个可以测试的结果,将不胜感激!

4

1 回答 1

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

这是我的 Rx 书中基于 MVVM 的测试的另一个很好的示例(对插件感到抱歉),特别是使用 CreateColdObservable 来模拟输入(即测试“单击按钮,等待 10 秒,检查结果”的场景)

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

于 2011-11-24T04:18:32.830 回答