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.MessageBox使用してリッスンします。MessageBus

これは、アプリケーションの実行時にはすべて正常に機能しますが、単体テストでは、バスがイミディエイト スケジューラを使用しているため、明らかに同じようには機能しません。

ここには設計上の問題があると思うので、実際の問題についての意見をお寄せください。テスト可能な結果を​​返すメッセージ ボックスを表示するには、非常にありがたいです!

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.
});

Pomodoro タイマーをテストする 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 に答える