【问题标题】:Async callback was not invoked within timeout specified by jasmine在 jasmine 指定的超时时间内未调用异步回调
【发布时间】:2017-12-14 07:57:59
【问题描述】:

当我尝试测试一个失败的承诺时,我在测试中遇到了这个错误:

在 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();
    });
});

我做错了什么?

【问题讨论】:

    标签: javascript angularjs jasmine karma-runner


    【解决方案1】:

    您是否在SideCtrl.accInfo.getInfo() 的任何地方使用间谍?如果不是,这可能是您的问题。您需要监视函数并手动返回承诺。像这样的东西应该工作。

    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() 来做到这一点。

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2019-08-24
      • 1970-01-01
      • 2017-07-24
      • 2015-05-26
      • 1970-01-01
      • 2019-09-21
      • 2018-11-21
      相关资源
      最近更新 更多