tl; dr是否可以在不重寫的情況下單元測試此代碼?我可以在沒有TestScheduler的情況下單元測試RxJS函數嗎?
http://jsbin.com/jezosegopo/edit?js,console
const keyUpObserver = ($input, fetchResults) => {
const source = Rx.Observable.fromEvent($input, 'keyup')
.map(e => e.target.value)
.filter(text => text.length > 2)
.debounce(300)
.distinctUntilChanged();
return source.flatMapLatest(text => Rx.Observable.fromPromise(fetchResults(text)));
};
在上面的代碼keyUpObserver
在很大程度上基於所述RxJS自動完成示例,並且使用去抖動,以防止錘擊服務器。
我試圖單元測試這個功能,但興農的useFakeTimers似乎並不奏效。
const clock = sinon.useFakeTimers();
const $input = $('<input>');
const fetchResults = (text) => new Promise(resolve => resolve(text + ' done!'));
keyUpObserver($input, fetchResults).subscribe(text => console.log(text));
$input.val('some text').trigger('keyup');
clock.tick(500);
// Enough time should have elapsed to make this a new event
$input.val('some more text').trigger('keyup');
我猜測這是不是興農相關要麼,不如說RxJS使用了一些必須由外部時鐘假不受影響內部時鐘。
鑑於這種情況,反正是有單元測試我keyUpObserver代碼,而無需重寫它也採取調度(默認在生產,測試單元測試)?
是有一些原因,你不能拿調度? – paulpdaniels