角度测试 - 用$ http依赖关系模拟服务

时间:2014-06-30 16:12:01

标签: angularjs unit-testing

我尝试使用自定义服务依赖项测试控制器。该服务依赖于$ http。在我的控制器中,我引用了"然后"承诺的一部分,但这使得测试代码爆炸了。您应该如何模拟服务并测试依赖于它的控制器? Here's a plunker with the whole debacle.我的服务如下:

  app.service('FooService', ['$http', function($http){
    return {
      getFoo: function(){
        return $http.get('Foo');
      },
      getBar: function(){
        return 'bar';
      }
    };
  }]);

控制器:

  app.controller('FooController', ['$scope', 'FooService', function(scope, FooService){
    scope.hi = function() {};

    scope.getFoo = function(){
      FooService.getFoo().then(function(data){
        scope.bar = data.data;
      });
    };

    scope.getBar = function(){
      scope.bar = FooService.getBar();
    };
  }]);

根据我的理解,$ http依赖项不应该在控制器上,以推动可测试性和关注点分离。但是,现在我对承诺有困难......应该如何正确地完成?

1 个答案:

答案 0 :(得分:1)

您可以使用$ httpBackend模拟http调用。在您的plunker中,httpBackend无法正常工作的主要原因是您正在调用respond(1),其响应时HTTP状态代码为1.如果您将其更改为respond(200, 1),那么它应该有效:

http://plnkr.co/edit/ubJH3iABaGpINFKTvGTx?p=preview

您也可以使用angular的$q服务模拟FooService,以创建类似于$ http返回的承诺。您还需要致电scope.$apply()让承诺解决类似于您在另一个示例中调用$httpBackend.flush()的方式。这是一个工作样本:

http://plnkr.co/edit/3xbCmBTQ4ChVlhaTZXwC?p=preview