在jasmine指定的超时内未调用异步回调

时间:2017-12-14 07:58:00

标签: javascript angularjs jasmine karma-runner

我尝试测试失败的承诺时,在测试中出现此错误:

  

在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时时间内未调用异步回调

it('should fail on the getInfo request', function (done) {                  
    SideCtrl.accInfo.getInfo.and.returnValue(Promise.reject({}));
    SideCtrl.accInfo.getInfo().then(() => {}).catch(() => {                
        expect(SideCtrl.someMethod).toHaveBeenCalledWith({
            first_name: '',
            last_name: ''
        });
        done();
    });
});

我做错了什么?

1 个答案:

答案 0 :(得分:0)

你在SideCtrl.accInfo.getInfo()的任何地方使用间谍吗?如果不是这可能是你的问题。您需要监视该函数并手动返回promise。这样的事情应该有效。

spyOn(SideCtrl.accInfo, 'getInfo').and.callFake(() => {
    const deferred = $q.defer();
    deferred.reject({});
    return deferred.promise;
});

你也可以这样做

beforeEach(angular.mock.inject(_$q_) => {
    const getInfoDeferred = $q.defer();
    spyOn(SideCtrl.accInfo, 'getInfo').and.returnValue(getInfoDeferred.promise);
}


it('should fail on the getInfo request', function (done) {
    SideCtrl.accInfo.getInfo();                  
    getInfoDeferred.reject({});
    $rootScope.$digest();

    expect(SideCtrl.someMethod).toHaveBeenCalledWith({
        first_name: '',
        last_name: ''
    });
    done();
});

});

您需要启动摘要周期才能获得返回的承诺。您可以致电$rootScope.$apply()$rootScope.$digest()