基本的RX TestScheduler定时

本文关键字:TestScheduler 定时 RX | 更新日期: 2023-09-27 18:10:41

我正在使用RX做一些(非常基本的)事件订阅:-

public void StartListening(IObservable<Item> observable)
{
   subscription = observable
      .Buffer(TimeSpan.FromSeconds(5))
      .Where(Enumerable.Any)
      .Subscribe(events => service.DoStuffInBatch(events));
}

现在我想要的是一组单元测试来证明这个方法的行为。例如:-

  • 如果我得到数据,但时间还没有过去5秒,我们永远不会调用DoStuffInBatch。
  • 如果我得到数据,时间已经过去了5秒,我调用DoStuffInBatch与数据。
  • 如果我没有得到数据,时间已经过去了5秒,我不调用DoStuffInBatch。
  • 如果我在两个窗口上获得数据,例如一些在3秒,一些在8秒,我调用两次DoStuffInBatch。

我一直在阅读Bart提供的所有示例(例如http://blogs.msdn.com/b/rxteam/archive/2012/06/14/testing-rx-queries-using-virtual-time-scheduling.aspx),但我真的很难完成我的测试。下面是一个例子:-

[Test]
public void StartListening_SomeDataAndBatchTimeHasNotPassed_DoesNotDoStuffInBatch()
{
    var scheduler = new TestScheduler();
    // Act - call the class under test, supplying a set of dummy data on the test scheduler
    listener.StartListening(GenerateTestData(5).ToObservable(scheduler));
    // Move the scheduler forward by one second
    scheduler.AdvanceBy(TimeSpan.FromSeconds(1).Ticks);
    // Assert that we never called the service as we haven't yet advanced 5 seconds
    Mock.Assert(() => mockService.DoStuffInBatch(null), Args.Ignore(), Occurs.Never());
}

然而,这个测试失败了。只要我调用AdvanceBy,订阅就会触发并调用DoStuffInBatch。

我显然做错了什么,但我不知道我做错了什么。

基本的RX TestScheduler定时

也许你可以尝试传递一个IScheduler参数到StartListening方法,并使用它来传递TestScheduler实例到。buffer(),或一个。subscribeon()调用?

在运行时,您只需默认为对您的情况敏感的默认值。