javascript - 我如何使用带有 promise 和延迟的 TestScheduler?

标签 javascript asynchronous jasmine rxjs

我试图让 Jasmine、promises 和 Rx.TestScheduler 一起很好地发挥作用,但我遇到了一个似乎无法解决的障碍。

我想要实现的是使用 RxJs 和 Jasmine 测试延迟 promise 。

我在这里 JsFiddle 中创建了问题的最小重现:https://jsfiddle.net/t9gsymu2/2/

这是该 fiddle 的完整 javascript 代码:

'use strict';

// fail if a test takes longer than 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;

describe('TestScheduler', function () {
    it('should work when combining the testscheduler and delay', function (done) {
        var scheduler = new Rx.TestScheduler();
        var people = Rx.Observable.just({
            name: 'Jeff'
        });
        var peopleWithTheirAge = people.flatMap(function (person) {
            return Rx.Observable.just({
                name: 'Jeff',
                age: 25
            });
        });
        var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
        delayedPeopleWithTheirAge.subscribe(function (person) {
            expect(person).toEqual({
                name: 'Jeff',
                age: 25
            });
            done();
        });
        scheduler.start();
    });

    it('should work when combining the testscheduler, delay AND a promise', function (done) {
        var scheduler = new Rx.TestScheduler();
        var people = Rx.Observable.just({
            name: 'Jeff'
        });
        var peopleWithTheirAge = people.flatMap(function (person) {
            return Promise.resolve({
                name: 'Jeff',
                age: 25
            });
        });
        var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
        delayedPeopleWithTheirAge.subscribe(function (person) {
            expect(person).toEqual({
                name: 'Jeff',
                age: 25
            });
            done();
        });
        scheduler.start();
    });
});

这两个测试与 T 相同,唯一的区别是第一个测试使用 Rx.Observable.just 而第二个测试使用 Promise.resolve。 (我可以使用 Rx.Observable.fromPromise 来确保实际创建了一个 Observable,但是 1. 我已经试过了 2. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/promises.md 的文档明确指出 flatMap 支持 Promise 对象)

第一个测试立即成功。 Observable 使用可以模拟时间的 Rx.TestScheduler 延迟 2 秒。 scheduler.start() 方法立即执行任何计划任务,而不是等待 2 秒。 Jasmine 支持在您的测试中使用“完成”参数的异步测试,这实际上只是您认为测试完成时需要调用的一个函数。

但是,第二个测试失败了。我假设这与 Promises 是异步的有关,这会导致 TestScheduler 无法接收这些回调中发生的任何事情。

如有任何帮助,我们将不胜感激!

最佳答案

我最近很火,这是我在 SO 上发布问题后不久找到答案的第二次。

无论如何,解决方案是使用 RxJs 库中内置的 MockPromise。

因此,不要使用 Promise.resolve(true),而是使用 scheduler.createResolvedPromise(100, true)

这是工作 fiddle :https://jsfiddle.net/t9gsymu2/4/

完整代码:

'use strict';

// fail if a test takes longer than 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;

describe('TestScheduler', function () {
    it('should work when combining the testscheduler and delay', function (done) {
        var scheduler = new Rx.TestScheduler();
        var people = Rx.Observable.just({
            name: 'Jeff'
        });
        var peopleWithTheirAge = people.flatMap(function (person) {
            return Rx.Observable.just({
                name: 'Jeff',
                age: 25
            });
        });
        var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
        delayedPeopleWithTheirAge.subscribe(function (person) {
            expect(person).toEqual({
                name: 'Jeff',
                age: 25
            });
            done();
        });
        scheduler.start();
    });

    it('should work when combining the testscheduler, delay AND a promise', function (done) {
        var scheduler = new Rx.TestScheduler();
        var people = Rx.Observable.just({
            name: 'Jeff'
        });
        var peopleWithTheirAge = people.flatMap(function (person) {
            return scheduler.createResolvedPromise(100, {
                name: 'Jeff',
                age: 25
            });
        });
        var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
        delayedPeopleWithTheirAge.subscribe(function (person) {
            expect(person).toEqual({
                name: 'Jeff',
                age: 25
            });
            done();
        });
        scheduler.start();
    });
});

关于javascript - 我如何使用带有 promise 和延迟的 TestScheduler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32602671/

相关文章:

java - 如何在选择同一 div 中存在的下拉列表时在 div 末尾附加动态生成的 HTML 表格?

javascript - 根据用户年龄显示div

ios - 在 Objective C 中动态修改 UICollectionViewCell 中单元格的高度

java - ListenableFuture 链可以处理内部 ExecutionException 吗?

javascript - 如何根据 Jasmine 单元测试中的其他对象测试功能

javascript - 当父位置改变时 JQuery 删除元素

javascript - 如果有多个复选框,为什么只有一个复选框起作用

javascript - Node.js 代码被跳过 (for)

javascript - Jasmine 链测试

javascript - Jasmine 错误: Expected spy decode to have been called with [ [ ] ] but actual calls were [ undefined ]