Promise 在单元测试中解决得太晚

Promise resolves too late in unit test

使用 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()。

我怎样才能让 promise 立即 resolve 以便测试可以通过?

这解决了它:

$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
});