我正在使用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。
我显然做错了什么,但我不知道我做错了什么。
也许你可以尝试传递一个IScheduler
参数到StartListening
方法,并使用它来传递TestScheduler
实例到。buffer(),或一个。subscribeon()调用?
在运行时,您只需默认为对您的情况敏感的默认值。