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代码进行单元测试,而无需重写它也可以使用调度程序(在生产环境中为默认值,在单元测试中为默认值)?
最佳答案
...寻求答案:似乎RxJs正在使用Sinon应该能够覆盖的默认/全局setTimeout
实现。如果您不通过(如前所述)自定义调度程序,那么阅读它所使用的 defiultscheduler's
code至少就是我要说的。
尽管如此,我对这个打算还是有些困惑。从this little fork中,我希望只有第三个触发器才能实际触发它执行的操作,否则我应该脱节吗? 👀
关于unit-testing - 我可以在没有TestScheduler的情况下对RxJS函数进行单元测试吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33896113/