使用 'notify' promise 对 angular responseError 拦截器进行单元测试
unit test for angular responseError interceptor with 'notify' promise
我有 angular responseError 拦截器,它实现了在先前尝试不成功时向服务器重新发送请求的逻辑。此外,拦截器 returns 'notify' 承诺与当前状态保持联系。
return {
responseError: function(response) {
var retries = angular.isDefined(response.config.headers['X-RETRIES']) ? response.config.headers['X-RETRIES'] : 0;
response.config.headers['X-RETRIES'] = retries + 1;
if (response.config.headers['X-RETRIES'] <= MAX_XHR_ATTEMPTS) {
var $http = $injector.get('$http'),
defer = $q.defer();
$timeout(function() {
defer.notify('trying');
defer.resolve($http(response.config));
}, 1000);
return defer.promise;
} else {
return $q.reject(response);
}
}
};
}
这是示例,但它工作正常,对于单元测试,我使用 tdd、mocha、chai、sinon。我使用了类似的代码:(拦截器在上面的代码中注入)
test('test', inject(function($http, ) {
$httpBackend.when('GET', '/test').respond(500);
var promise = $http.get('/test');
$httpBackend.flush();
promise.then(
function(data) {
dump('success', data);
},
function(data) {
dump('error', data);
},
function(data) {
dump('notify', data);
}
);
}));
但诺言没有 return 任何状态。如果我尝试将拦截器更改为 return 'reject' promise 一旦发生错误(没有超时和额外的拉取请求)在这种情况下一切都按预期工作。如何对案例进行测试?
您没有刷新 $timeout - 请尝试以下操作:
test('test', inject(function($http, $timeout) {
$httpBackend.when('GET', '/test').respond(500);
var promise = $http.get('/test');
$httpBackend.flush();
promise.then(
function(data) {
dump('success', data);
},
function(data) {
dump('error', data);
},
function(data) {
dump('notify', data);
}
);
// Timeout after we've attached notify listener.
$timeout.flush(1001);
}));
我有 angular responseError 拦截器,它实现了在先前尝试不成功时向服务器重新发送请求的逻辑。此外,拦截器 returns 'notify' 承诺与当前状态保持联系。
return {
responseError: function(response) {
var retries = angular.isDefined(response.config.headers['X-RETRIES']) ? response.config.headers['X-RETRIES'] : 0;
response.config.headers['X-RETRIES'] = retries + 1;
if (response.config.headers['X-RETRIES'] <= MAX_XHR_ATTEMPTS) {
var $http = $injector.get('$http'),
defer = $q.defer();
$timeout(function() {
defer.notify('trying');
defer.resolve($http(response.config));
}, 1000);
return defer.promise;
} else {
return $q.reject(response);
}
}
};
}
这是示例,但它工作正常,对于单元测试,我使用 tdd、mocha、chai、sinon。我使用了类似的代码:(拦截器在上面的代码中注入)
test('test', inject(function($http, ) {
$httpBackend.when('GET', '/test').respond(500);
var promise = $http.get('/test');
$httpBackend.flush();
promise.then(
function(data) {
dump('success', data);
},
function(data) {
dump('error', data);
},
function(data) {
dump('notify', data);
}
);
}));
但诺言没有 return 任何状态。如果我尝试将拦截器更改为 return 'reject' promise 一旦发生错误(没有超时和额外的拉取请求)在这种情况下一切都按预期工作。如何对案例进行测试?
您没有刷新 $timeout - 请尝试以下操作:
test('test', inject(function($http, $timeout) {
$httpBackend.when('GET', '/test').respond(500);
var promise = $http.get('/test');
$httpBackend.flush();
promise.then(
function(data) {
dump('success', data);
},
function(data) {
dump('error', data);
},
function(data) {
dump('notify', data);
}
);
// Timeout after we've attached notify listener.
$timeout.flush(1001);
}));