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