Rx TestScheduler与Return和Delay不兼容

时间:2017-10-16 15:58:31

标签: unit-testing system.reactive

我在编写包含ReturnDelay组合的可观察对象时遇到问题。问题是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);

1 个答案:

答案 0 :(得分: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);