test unitaire pour intercepteur de responseError angulaire avec promesse « notifier »

voix
1

Je intercepteur responseError angulaire, qui met en oeuvre la logique de réémission demande au serveur si une précédente tentative a échoué. De plus, les rendements intercepteurs « Alertez » promettent de rester en contact sur l'état actuel.

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

        }
    };
}

Il est par exemple, mais il fonctionne correctement, pour les tests unitaires que j'utilise TDD, mocha, chai, sinon. Je code similaire: (l'intercepteur est injecté dans le code ci-dessus)

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

Mais la promesse ne renvoie aucun état. si j'essayé de changer intercepteur pour retourner « rejeter » une fois la promesse qu'une erreur est survenue (sans délai et demande de traction supplémentaire) dans ce cas, tout fonctionne comme prévu. Comment faire pour tester le cas?

Créé 07/01/2015 à 10:51
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Vous ne l'avez pas vider le délai d'attente de $ - essayez ce qui suit:

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

    }));
Créé 07/01/2015 à 11:25
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more