在AngularJS单元测试中,在递归$ timeout中断言http调用的数量

时间:2015-03-15 09:11:29

标签: javascript angularjs unit-testing recursion timeout

我目前有一个递归函数,可以轮询网页并重试非200响应:

app.service('PingService', function($q, $http, $timeout) {

var timer = null;
var deferred = $q.defer();

function ping() {

    var url = 'http://www.google.com';

    function successCallback() {
        deferred.resolve();
    }

    function retry(accountName) {
        timer = $timeout(ping, 2000);
    }

    $http.get(url).success(successCallback).error(retry);
}

return {
    pingUrl: function() {
        ping();
        return defer.promise;
    }
}

为了测试这个实现,我目前在jasmine中进行了以下测试:

it('should retry on non 200 response', function() {  
    $httpBackend.whenGET('http://www.google.com').respond(504);

    PingService.pingUrl();

    $httpBackend.flush();

    $timeout.flush(4001);
    $httpBackend.flush(2);
 }

不幸的是,这没有通过,因为队列中似乎只有1个http请求,而不是我期望的经过时间的2个。

对我来说,使用$ timeout的递归函数对一段时间内进行的http重试次数进行单元测试吗?

1 个答案:

答案 0 :(得分:-1)

我不知道你在尝试用$ timeout.flush()做什么?我会使用jasmine的内置时钟功能来勾选所需的时间。