2015-06-12 15 views
0

我有在this.store存儲數據並採取鍵盤事件在this.streamRx.js陣營擴展測試流和中間結果

模塊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

測試時,應該使用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(); 
+0

謝謝。讓我先讀一讀吧! –

+0

這是完全可行的。我會讀到它謝謝! –