承诺在单元测试中解决得太晚了

时间:2016-01-10 23:03:58

标签: angularjs jasmine firebase angularfire

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

在此测试中,承诺在测试完成后得到解决:

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 async done功能:

        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(),没有任何更改。

我如何立即解除承诺,以便测试可以通过?

1 个答案:

答案 0 :(得分:0)

这解决了它:

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