tl; dr是否可以对此代码进行单元测试而无需重写?
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自动填充示例,并使用去抖动来防止锤击服务器。
我正在尝试对此功能进行单元测试,但Sinon的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');
我猜这不是与sinon有关,而是RxJS使用一些内部时钟,它必须不受外部假时钟的影响。
鉴于此,无论如何都要对我的keyUpObserver代码进行单元测试而不重写它也需要一个调度程序(生产中默认,单元测试中测试)?
答案 0 :(得分:1)
...接近答案:似乎RxJs正在使用Sinon应该能够覆盖的默认/全局setTimeout
实现。至少这是我在阅读defiultscheduler's
code时所说的内容,如果你没有通过(如上所述)自定义调度程序那么。
尽管如此,我对此打算有点困惑。从this little fork开始,我只期望第三个触发器实际触发它所做的事情,或者我应该脱节?