3

我正在使用 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。

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

4

1 回答 1

0

也许您可以尝试将IScheduler参数传递给StartListening方法,并使用它将TestScheduler实例传递给 .Buffer() 或 .SubscribeOn() 调用?

在运行时,您只需默认为您的案例敏感的默认值。

于 2013-04-24T21:48:27.483 回答