ReactiveUI MessageBus и MessageBox с результатом - PullRequest
0 голосов
/ 22 ноября 2011

Я уже некоторое время использую 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 - это, по сути, оболочка для класса System.Windows.MessageBox, который я слушаю, используяMessageBus в пользовательском интерфейсе и в моих тестах.

Все это прекрасно работает при запуске приложения, но в модульных тестах, поскольку шина затем использует планировщик Immediate, она, очевидно, работает не так.

Я чувствую, что здесь есть какой-то сбой в дизайне, так что любой вклад в реальную проблему;было бы очень благодарно за отображение окна сообщения, возвращающего результат, который можно протестировать!

1 Ответ

1 голос
/ 24 ноября 2011

Трудно сказать, не видя больше деталей реализации, но я бы подумал об использовании TestScheduler.В RxUI.Testing это так просто:

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

Вот пример группы тестов, связанных с MVVM, тестирующих таймер Pomodoro:

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

Вот еще один хороший пример тестирования на основе MVVM из моей книги Rx (извините за плагин), в частности, с использованием CreateColdObservable для имитации ввода (т. Е. Тестирования сценария «Нажмите кнопку, подождите 10 секунд»)., результат проверки ")

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...