我一直在阅读:Testing Rx Queries using Virtual Time Scheduling
我到了“使用单元测试项目”部分(大约在页面的中间)并自己尝试了(使用 VS2012 和 MSTest),但我的结果与文档中的不同。具体来说,我的断言失败了。
这是我的测试代码:
[TestMethod]
public void TestMethod1()
{
var scheduler = new TestScheduler();
var xs = scheduler.CreateColdObservable(
OnNext(10, 42),
OnCompleted<int>(20));
var observer1 = scheduler.CreateObserver<int>();
scheduler.Schedule(TimeSpan.FromTicks(190),
(s, t) => xs.Subscribe(observer1));
var observer2 = scheduler.CreateObserver<int>();
scheduler.Schedule(TimeSpan.FromTicks(220),
(s, t) => xs.Subscribe(observer2));
scheduler.Start();
observer1.Messages.AssertEqual(
OnNext(200, 42),
OnCompleted<int>(210));
observer2.Messages.AssertEqual(
OnNext(230, 42),
OnCompleted<int>(240));
}
我必须做出的一项改变是:
scheduler.Schedule(TimeSpan.FromTicks(190),
() => xs.Subscribe(observer1));
变成:
scheduler.Schedule(TimeSpan.FromTicks(190),
(s, t) => xs.Subscribe(observer1));
老实说,我没有掌握这种变化的影响(我没有用 C# 编码那么久!)。
结果如下:
Assert.Fail failed.
Expected: [OnNext(42)@200, OnCompleted()@210]
Actual..: [OnNext(42)@11, OnCompleted()@21]
我理解它的方式是我正在创建一个冷可观察对象,它将在第 10 个刻度返回值 42,并且序列在第 20 个刻度完成。然后,我创建和观察者订阅了这个 observable,表明我希望计划从滴答 190 开始。因此,在滴答 200 (190 + 10) 测试值 42,完成时间在滴答 210。然而,我得到滴答 11 和分别为 21 个。
该文档基于 V2 的 pre-RTM,所以我不确定 TestScheduler 的行为是否在 RTM 中发生了变化,或者我是否在某个地方犯了错误。如果有人能解释发生了什么,我将不胜感激。