2017-10-16 63 views
3

我無法爲包含ReturnDelay的組合的observable編寫單元測試。問題是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); 

奇怪的是,當我加入createdsubscribeddisposed定時到Start方法它的工作。這一切都很好,但我真的需要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存儲庫中有一個關於「開始」重載的票。 https://github.com/Reactive-Extensions/Rx.NET/issues/81 – Wouter