【问题标题】: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() 来做到这一点。