【问题标题】:Rx TestScheduler does not play nice with Return and DelayRx TestScheduler 不能很好地处理 Return 和 Delay
【发布时间】:2017-10-16 15:58:30
【问题描述】:

我在为包含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 功能。我的实际测试用例更复杂,需要对 observable 的输入进行手动计时。

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);

【问题讨论】:

    标签: unit-testing system.reactive


    【解决方案1】:

    我从未使用过您正在使用的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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2012-06-01
    • 2017-03-29
    • 2014-08-17
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多