代码之家  ›  专栏  ›  技术社区  ›  Wouter

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

  •  4
  • Wouter  · 技术社区  · 7 年前

    我在为包含以下组合的可观察对象编写单元测试时遇到问题: Return Delay . 问题是 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);
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   Shlomo    7 年前

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