我可以在没有TestScheduler的情况下对RxJS功能进行单元测试吗?

时间:2015-11-24 14:24:04

标签: unit-testing sinon observable rxjs

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代码进行单元测试而不重写它也需要一个调度程序(生产中默认,单元测试中测试)?

1 个答案:

答案 0 :(得分:1)

...接近答案:似乎RxJs正在使用Sinon应该能够覆盖的默认/全局setTimeout实现。至少这是我在阅读defiultscheduler's code时所说的内容,如果你没有通过(如上所述)自定义调度程序那么。

尽管如此,我对此打算有点困惑。从this little fork开始,我只期望第三个触发器实际触发它所做的事情,或者我应该脱节?