2017-10-16 9 views
3

ReturnDelayの組み合わせを含む観測値の単体テストを書くのに問題があります。問題は、TestSchedulerは、どの程度の時間が経過しても通知を出さないということです。Rx TestSchedulerがリターンとディレイでうまく動作しない

var scheduler = new TestScheduler(); 
var input = new Subject<bool>(); 

var output = scheduler.Start(() => 
    Observable.Return("feed me", scheduler) 
       .Delay(TimeSpan.FromSeconds(1), scheduler)); 

scheduler.AdvanceBy(1); 
Assert.Equal(0, output.Messages.Count); 

// Expecting an OnNext and an OnCompleted notification 
scheduler.AdvanceBy(TimeSpan.FromSeconds(2).Ticks); 
Assert.Equal(2, output.Messages.Count); 

奇妙なことは、私はStart方法にcreatedsubscribeddisposedタイミングを追加するとき、それは仕事をしていることです。それはすべて罰金とダンディーですが、私は本当にAdvanceByの機能が必要です。私の実際のテストケースはもっと複雑であり、観測可能な入力の手作業のタイミングが必要です。

var scheduler = new TestScheduler(); 
var source = Observable 
    .Return("Winner!", scheduler) 
    .Delay(TimeSpan.FromSeconds(1), scheduler); 
var output = scheduler.Start(() => source, 
    0, 
    0, 
    TimeSpan.FromSeconds(5).Ticks); 

Assert.Equal(2, output.Messages.Count); 

答えて

4

使用しているStartメソッドを使用したことがありません。どのように、なぜそれがうまくいくのかを決して理解できませんでした。

これは動作するはずです:

var scheduler = new TestScheduler(); 
var input = new Subject<bool>(); 

var observable = Observable.Return("feed me") 
    .Delay(TimeSpan.FromSeconds(1), scheduler); 

var observer = scheduler.CreateObserver<string>(); 
observable.Subscribe(observer); 

scheduler.AdvanceBy(1); 
Assert.Equal(0, observer.Messages.Count); 

// Expecting an OnNext and an OnCompleted notification 
scheduler.AdvanceBy(TimeSpan.FromSeconds(2).Ticks); 
Assert.Equal(2, observer.Messages.Count); 
+0

おかげで、これはうまく動作しません。私は唯一の人ではないようですが、Rx.NETリポジトリに 'Start'オーバーロードに関するチケットがあります。 https://github.com/Reactive-Extensions/Rx.NET/issues/81 – Wouter

関連する問題