Rx.js React扩展测试流和中间结果

时间:2015-06-12 10:25:46

标签: unit-testing reactjs rxjs

我有一个模块,用于存储this.store中的数据,并在this.stream中接受键盘事件

this.store和this.stream之间的关系如下

this.stream.subscribe(function(keyCode){
    this.store.add(100)
});

现在我正在编写针对这些事件的测试用例。我想知道当我单击键盘3次时,中间结果是什么。

所以测试用例如下:

var keyboardSource = Rx.Observable.create(function(observer) {
    observer.onNext({
      keyCode: defaultValidOption.default.keyboardData[0]
    });
    observer.onNext({
      keyCode: defaultValidOption.default.keyboardData[1]
    });
    observer.onNext({
      keyCode: defaultValidOption.default.keyboardData[2]
    });
  });

module.stream.subscribe(x => {
    module.store.total.should.equal(300);
    done();
});

这是正确的,因为我可以在触发整个流事件时获得最终结果。

但以下是不正确的。

module.stream.bufferWithCount(2).subscribe(x => {
    module.store.total.should.equal(200);
    done();
});

那么如何在我的测试用例中延迟这些事件,以便我可以得到非常好的结果。感谢。

1 个答案:

答案 0 :(得分:1)

测试时,您应该使用TestScheduler来明确控制时间,而不是依赖于默认值。因此,我建议您将测试代码更改为:

var onNext = Rx.ReactiveTest.onNext;
var onCompleted = Rx.ReactiveTest.onCompleted;
var scheduler = new Rx.TestScheduler();

var keyboardSource =  scheduler.createHotObservable(
onNext(10, {keyCode: defaultValidOption.default.keyboardData[0]}),
onNext(20, {keyCode: defaultValidOption.default.keyboardData[1]}),
onNext(30, {keyCode: defaultValidOption.default.keyboardData[2]}),
onCompleted(100));

//Hook up keyboardSource to your stream
keyboardSource.subscribe(/*However your stream is hooked up*/);

//You can then move the scheduler's time forward at your own pace

scheduler.advanceBy(20);

module.store.total.should.equal(200);

scheduler.advanceBy(10);

module.store.total.should.equal(300);

done();