4

次のような登録を含むビューモデルを単体テストしたい:

 public SampleViewModel(IUnityContainer container)
    {
...
    Observable.FromEventPattern<PropertyChangedEventArgs>(gridViewModel, "PropertyChanged")
                    .**ObserveOnDispatcher()**
                    .Subscribe(_ => this.Update());
...
}

単体テストを実行すると、このコードに到達すると、「現在のスレッドには Dispatcher が関連付けられていません。 」と表示されます。

1 つの解決策は、Scheduler を使用することですが、Viewmodel を変更したくありません。

単体テストでエラーを発生させずにこのステートメントに合格させる解決策はありますか?

4

4 に答える 4

8

演算子を使用する代わりに、独自のIScheduler実装を提供することをお勧めします。aまたは aをロードする手法を使用しましたが、問題はまだ Dispatcher を使用していることです。最終的に、特にバックグラウンド スレッドが長時間実行されている場合は、「崖から落ちる」だけであることがわかりました。「単体テストではスレッド化しない」というガイドラインに従って、ディスパッチャーが ViewModel に近づかないようにしてください。単体テストは、はるかに高速に実行されます。ObserveOn(IScheduler)ObserveOnDispatcher()DispatcherFrameDispatcher

これに対処するためのはるかに優れた方法は、(ISchedulerインターフェースを介して) Dispatcher Scheduler へのアクセスを提供するインターフェースを注入することです。これにより、 を公開する実装で置き換えることができますTestScheduler。単体テストで時間を制御できるようになりました。どのアクションが各スケジューラーにマーシャリングされるかを制御および検証できます。

これは、2009 年初頭からの Dispatcher 呼び出しを使用した WPF の「ユニット」テストに関する非常に古い (Rx 以前の) 投稿です。当時は良いアイデアのように思えました。

https://leecampbell.com/2009/02/17/responsive-wpf-user-interfaces-part-5/

Rx を使用したテストの詳細については、RxTestSchedulerに関する私の他のサイトを参照してください。

http://introtorx.com/Content/v1.0.10621.0/16_TestingRx.html

于 2013-09-25T22:05:32.550 に答える
1

ビューモデルを適切に単体テストするには、その依存関係をすべて提供できる必要があります。この場合、ビューモデルはディスパッチャに依存しています。ビューモデルにIScheduler依存関係を持たせることが理想的な方法です。しかし、本当にそれをしたくない場合は、次の重複した質問を見てみてください: Unit test IObservable<T> with ObserveOnDispatcher

于 2013-09-20T13:31:09.187 に答える