【发布时间】:2015-09-30 19:42:03
【问题描述】:
这是我的Interval 定义:
m_interval = Observable.Interval(TimeSpan.FromSeconds(5), m_schedulerProvider.EventLoop)
.ObserveOn(m_schedulerProvider.EventLoop)
.Select(l => Observable.FromAsync(DoWork))
.Concat()
.Subscribe();
在上面的代码中,我在SchedulerProvider 的Interval 和ObserveOn 中输入了IScheduler,这样我就可以更快地进行单元测试(TestScheduler.AdvanceBy)。另外,DoWork 是一个 async 方法。
在我的特定情况下,我希望每 5 秒调用一次 DoWork 函数。这里的问题是我希望 5 秒是 DoWork 结束和另一个开始之间的时间。因此,如果DoWork 的执行时间超过 5 秒,比如说 10 秒,第一次调用将在 5 秒,第二次调用将在 15 秒。
不幸的是,以下测试证明它的行为并非如此:
[Fact]
public void MultiPluginStatusHelperShouldWaitForNextQuery()
{
m_queryHelperMock
.Setup(x => x.CustomQueryAsync())
.Callback(() => Thread.Sleep(10000))
.Returns(Task.FromResult(new QueryCompletedEventData()))
.Verifiable()
;
var multiPluginStatusHelper = m_container.GetInstance<IMultiPluginStatusHelper>();
multiPluginStatusHelper.MillisecondsInterval = 5000;
m_testSchedulerProvider.EventLoopScheduler.AdvanceBy(TimeSpan.FromMilliseconds(5000).Ticks);
m_testSchedulerProvider.EventLoopScheduler.AdvanceBy(TimeSpan.FromMilliseconds(5000).Ticks);
m_queryHelperMock.Verify(x => x.CustomQueryAsync(), Times.Once);
}
DoWork 调用CustomQueryAsync 并且测试失败,说它被调用了两次。由于.Callback(() => Thread.Sleep(1000)) 强制延迟,它应该只被调用一次。
我在这里做错了什么?
我的实际实现来自this example。
【问题讨论】:
标签: c# unit-testing system.reactive