我如何让 TestScheduler 在 RxJs5 中打勾?

How do I get TestScheduler to tick in RxJs5?

我正在尝试在 RxJs 版本 5 中使用 Observable.interval 编写示例单元测试。我是 运行 以下代码,但我的 observable 只触发一次,而不是 20 次,因为预期。

it('does its interval thing synchonously', ()=> {

        let x = [];
        let scheduler = new Rx.TestScheduler();
        let interval$ = Rx.Observable.interval(500, scheduler).take(20);

        interval$.subscribe(
            value => {
                x.push(value);
                console.log(value)
            },
        );

        for(let i = 0; i < 20; i++) {
            scheduler.flush();
        }

        expect(x.length).toBe(20);

    });

如何让我的 TestScheduler 将 Observable 向前移动 10000 毫秒?

我的理解是 TestScheduler 旨在与 marble testing and works with observables composed from those returned by its createColdObservable and createHotObservable 方法一起使用。

相反,您可以使用 VirtualTimeScheduler - TestScheduler 所基于的:

let scheduler = new Rx.VirtualTimeScheduler();
let interval$ = Rx.Observable.interval(500, scheduler).take(20);

let values = [];
interval$.subscribe(value => values.push(value));

scheduler.flush();
console.log(values);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>

请注意,只需要一个 flush 调用。