我尝试使用自定义服务依赖项测试控制器。该服务依赖于$ 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依赖项不应该在控制器上,以推动可测试性和关注点分离。但是,现在我对承诺有困难......应该如何正确地完成?
答案 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()
的方式。这是一个工作样本: