Я уже некоторое время использую 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, она, очевидно, работает не так.
Я чувствую, что здесь есть какой-то сбой в дизайне, так что любой вклад в реальную проблему;было бы очень благодарно за отображение окна сообщения, возвращающего результат, который можно протестировать!