$ http模拟在测试中不是持久的

时间:2014-01-28 09:58:55

标签: angularjs unit-testing mocking jasmine

这是为$http嘲笑设置的吗?

出于某种原因,我收到了这个错误:

  

未捕获错误:意外请求:GET http://

describe('DataService tests',function(){

    var errorUrl = "/ErrorReturningURL";
    var successUrl = "/SuccessReturningURL";

    beforeEach(angular.mock.module('app'));

    beforeEach(angular.mock.inject(function ($httpBackend) {
        $httpBackend.when('GET', successUrl).respond('all good!');
        $httpBackend.when('GET', errorUrl).respond(404, '');
    }));

    it('should call the callbackError when http returns error', inject(function (DataService, $httpBackend) {
        var successCallback = jasmine.createSpy();
        var errorCallback = jasmine.createSpy();

        $httpBackend.expectGET(errorUrl);

        DataService.getData(errorUrl, successCallback, errorCallback);

        $httpBackend.flush();

        expect(errorCallback).toHaveBeenCalled();
    }));


}

) ;

服务(简化的):

app.service('DataService', function ($http, $parse) {

  this.getData = function (url, callbackSuccess, callbackError) {

      $http.get(url).success( function (data) {

        callbackSuccess( processedData );
      }).error( function (error) {
        callbackError(error);
      });

  };

});

1 个答案:

答案 0 :(得分:2)

原始$http

  • 我假设您在angular-mocks.js文件中添加了karma.js.conf
  • angular-mocks 会覆盖原来的$ httpBackend,因此无法进行实际请求。
  • $httpBackend mock具有同步API,但必须与异步应用程序集成。
  • flush()方法是异步应用程序和同步测试之间的连接链接。

来自$httpBackend docs

  

刷新HTTP请求

     

生产中使用的$ httpBackend始终以异步方式响应具有响应的请求。如果我们在单元测试中保留了这种行为,我们必须创建异步单元测试,这些测试很难编写,遵循和维护。同时测试模拟,不能同步响应,因为这会改变被测代码的执行。 因此,模拟$ httpBackend有一个flush()方法,它允许测试显式刷新挂起的请求,从而保留后端的异步api ,同时允许测试同步执行

您必须致电flush()以实际提出请求:

 $httpBackend.expectGET(errorUrl);

 DataService.getData(errorUrl, successCallback, errorCallback);

 $httpBackend.flush();

 expect(errorCallback).toHaveBeenCalled();