mercredi 7 janvier 2015

unit test for angular responseError interceptor with 'notify' promise

I have angular responseError interceptor, which implements logic of resending request to server if a previous attempt was unsuccessful. Moreover the interceptor returns 'notify' promise to keep in touch about current status.



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

}
};
}


It's example but it works properly, for unit tests I use tdd, mocha, chai, sinon. I used similar code: (the interceptor is injected in above code)



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


But the promise doesn't return any state. if I tried to change interceptor to return 'reject' promise once as an error is occurred (without timeout and additional pull request) in this case everything works as expected. How to make test for the case?


Aucun commentaire:

Enregistrer un commentaire