如何在Jasmine和Angular中模拟$ http超时

时间:2014-08-18 17:44:52

标签: angularjs jasmine

我正在尝试使用Jasmine模拟http超时。我创建了一个Angular HTTPInterceptor

angular.module('coreErrorHandler')
.factory('HTTPTimeoutInterceptorService', function($rootScope, $q, AppConfig) {
    return {
        'request': function(config) {
            config.timeout = 2000;
            return config;
        }
    };
});

我已将服务添加到$ httpProvider

$httpProvider.interceptors.push('HTTPTimeoutInterceptorService');

代码100%工作,我只是不确定如何使用Jasmine进行测试。

it('should wait for the timeout to elapse and issue an HTTP timeout error', function() {
    $httpBackend.when("GET", "http://google.com").respond({});
    var httpGetValue = $http.get("http://google.com");

    setTimeout(function(){
      $timeout.flush();
      console.log(httpGetValue);
      expect(SOMETHING).toEqual(false);
    }, 2100);
});

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

此处无需使用setTimeout,您必须将参数传递给$timeout.flush()以模拟时间已过去多长时间。

it('should wait for the timeout to elapse and issue an HTTP timeout error', function() {
    $httpBackend.when("GET", "http://google.com").respond({});
    var httpGetValue = $http.get("http://google.com");

    $timeout.flush(2100); // specify how long to simulate here
    console.log(httpGetValue);
    expect(SOMETHING).toEqual(false);
});

另见:$timeout in ngMock documentation

希望这有帮助。