私はこれを読んでいます: Virtual Time Scheduling を使用した Rx クエリのテスト
「単体テスト プロジェクトの使用」(ページの半分くらい) の部分に到達し、自分で (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));
}
私がしなければならなかった1つの変更はこれでした:
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 番目のティックでシーケンスが完了するコールド オブザーバブルを作成していることです。次に、このオブザーバブルにサブスクライブするオブザーバーを作成し、スケジュールをティック 190 で開始することを示します。したがって、ティック 200 (190 + 10) で値 42 をテストし、ティック 210 で完了時間をテストします。しかし、ティック 11 を取得し、それぞれ21。
このドキュメントは V2 の pre-RTM に基づいているため、TestScheduler の動作が RTM で変更されたのか、それともどこかで間違いを犯したのかはわかりません。誰かが何が起こっているのか説明していただければ幸いです。