Rx TestScheduler不能很好地处理返回和延迟
问题描述:
我无法为包含Return
和Delay
的组合的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);
奇怪的是,当我加入created
,subscribed
和disposed
定时到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);
谢谢,这也很好地工作。看来我并不是唯一的一个,在Rx.NET存储库中有一个关于“开始”重载的票。 https://github.com/Reactive-Extensions/Rx.NET/issues/81 – Wouter