【问题标题】:Promise resolves too late in unit testPromise 在单元测试中解决得太晚
【发布时间】:2016-01-10 23:03:58
【问题描述】:

使用 Firebase 和 angularFire 对应用进行单元测试。使用 mockfirebase 模拟 Firebase。

在这个测试中,promise 在测试完成后被解析:

describe('the service api', function() {
    var promiseResolved;

    beforeEach(function() {
        // Inject with expected values
        _setup();
        promiseResolved = jasmine.createSpy('promiseResolved');
    });

    it('should resolve to a obj', function() {
        var obj = objService.getObjFromRefString('1234/q1w2');
        obj.$loaded().then(promiseResolved);
        obj.$ref().flush();
        expect(promiseResolved).toHaveBeenCalled(); // fails
    });
});

这种方法似乎适用于the angularFire tests - 请参见第 125 行。

如果我使用 Jasmine 异步完成功能:

        it('should resolve to a obj', function(done) {
            var obj = objService.getObjFromRefString('1234/q1w2');
            obj.$ref().flush();
            obj.$loaded().then(function() {
                console.log('resolved');
                promiseResolved();
                expect(promiseResolved).toHaveBeenCalled();
                done();
            });
        });

失败并显示消息“错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调”。 console.log 显示在前面。

承诺似乎在超时后就解决了。我尝试调用 $rootScope.$apply() 而不做任何更改。

我怎样才能让承诺立即解决,以便测试通过?

【问题讨论】:

  • $flush() 不应该放在最后吗?无论如何,您也必须添加 $rootScope.$apply()。
  • 你检查过承诺是否真的成功解决了吗?如果被错误拒绝,done 将不会被调用。
  • @lex82 Firebase 操作在创建 obj 时排队。之后应该调用 ref.flush() 。不会更改任何内容以将其移至末尾。
  • @boyomarinov 是的,日志已完成,我检查了 promise.$$state.status 在调试器中为 1。它成功解决,但在超时之后。

标签: angularjs jasmine firebase angularfire


【解决方案1】:

这解决了它:

$timeout.flush();

更新测试:

it('should resolve to a obj', function() {
    var obj = objService.getObjFromRefString('1234/q1w2');
    obj.$loaded().then(promiseResolved);
    obj.$ref().flush();
    $timeout.flush();
    expect(promiseResolved).toHaveBeenCalled(); // great success
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多