Rx TestScheduler不能很好地处理返回和延迟

Rx TestScheduler不能很好地处理返回和延迟

问题描述:

我无法为包含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); 

我从来没有使用过您使用的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