单元测试角度响应错误拦截器与'通知'承诺

时间:2015-01-07 10:51:40

标签: angularjs unit-testing mocha sinon chai

我有一个angular responseError拦截器,如果之前的尝试不成功,它会实现向服务器重新发送请求的逻辑。此外,拦截器返回“通知”承诺,以保持联系当前状态。

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

但承诺不会返回任何状态。如果我尝试更改拦截器以在发生错误时返回“拒绝”承诺(没有超时和额外的拉取请求),在这种情况下一切都按预期工作。如何对案件进行测试?

1 个答案:

答案 0 :(得分:1)

您没有刷新$ 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);

    }));