3

私は、試験観測を支援するために、次のヘルパーメソッドを作成しました:TestSchedulerを使用してタイムアウト動作を達成する方法は?

public static void ExecuteObservableTest<T>(IObservable<T> observable, Action action, Action assert, bool expectTimeout, int timeout = 500) 
    { 
     Exception ex = null; 
     var scheduler = new TestScheduler(); 
     observable.Timeout(TimeSpan.FromMilliseconds(timeout)).ObserveOn(scheduler).Subscribe(_ => { }, e => ex = e); 
     action(); 
     scheduler.AdvanceBy(TimeSpan.FromMilliseconds(timeout).Ticks + 1); 
     assert(); 
     if (expectTimeout) Assert.IsNotNull(ex); 
     else Assert.IsNull(ex); 
    } 

物事は限り素晴らしい仕事、私はタイムアウトを期待していないよと。タイムアウトが予想されるテストケースでは、このメソッドはOnExceptionメソッドに到達することはありません。 TestSchedulerを使用してこれを達成する適切な方法は何ですか?

タイムアウトはソフトタイムアウトです。つまり、オブザーバブルが割り当てられた時間内に完了しなかった場合、完了することはありませんが、オブザーバブル自体には対応するタイムアウトは定義されていません。

答えて

2

あなたはthis overload

var scheduler = new TestScheduler(); 
observable.Timeout(TimeSpan.FromMilliseconds(timeout), scheduler) 
      .Subscribe(_ => { }, e => ex = e); 
+0

おかげで、@supertopiでTimeoutTestSchedulerを提供する必要があります。 Timeout overloadとObserveOn(スケジューラ)の両方を同じステートメントで使用しようとすると、後者は無視されているように見えるので、タイムアウトが今すぐに合格すると予想していました。 expectTimeoutをトグルするためにif-elseブロックを追加しました。なぜこれが起こるのか知っていますか?if文よりも洗練された解決策がありますか? – ket

+1

'scheduler.CreateObserver 'で 'ITestableObserver'を作成してください。テスト可能なオブザーバをテスト中の観測可能なものに登録します。 'TestObserver.Messages.AssertEqual(OnError(timeout)) 'のようなもので、タイムアウトが発生したかどうかを確認することができます。 – supertopi

+1

@ket:' TestScheduler'で 'ObserveOn'を使用しても実際にはできませんセンス。 ObserveOnは異なる目的を持っています。 UIに関連付けられたスケジューラー( 'DispatcherScheduler'など)をObserveOnすると、サブスクリプションからアプリケーションのUIを変更できることを確認できます。 'TestScheduler'は時間を圧縮するために使用され、' Timeout'のように時間が経過するのを待つ操作に引数として渡されます。 –

関連する問題