Angularjs 角度测试-使用$http依赖项模拟服务时出现问题

Angularjs 角度测试-使用$http依赖项模拟服务时出现问题,angularjs,unit-testing,Angularjs,Unit Testing,我正在尝试测试具有自定义服务依赖项的控制器。该服务依赖于$http。在我的控制器中,我引用了承诺的“then”部分,但这会导致测试代码爆炸。您应该如何模拟服务并测试依赖于它的控制器?我的服务如下所示: app.service('FooService', ['$http', function($http){ return { getFoo: function(){ return $http.get('Foo'); }, getBar:

我正在尝试测试具有自定义服务依赖项的控制器。该服务依赖于$http。在我的控制器中,我引用了承诺的“then”部分,但这会导致测试代码爆炸。您应该如何模拟服务并测试依赖于它的控制器?我的服务如下所示:

  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依赖项不应该在控制器上,以便驱动可测试性和关注点分离。然而,现在我在承诺上遇到了麻烦。。。如何正确地完成此操作?

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

您还可以使用angular的服务模拟FooService,以创建类似于$http返回的承诺。您还需要调用
scope.$apply()
,以使承诺的解析方式与另一个示例中调用
$httpBackend.flush()
的方式类似。以下是一个工作示例:


谢谢!IMO在Angular进行测试并不像广告宣传的那么容易——有很多方法会把事情搞砸。