Angularjs 如何使用HTTPGET为angular服务编写Jasmine测试?

Angularjs 如何使用HTTPGET为angular服务编写Jasmine测试?,angularjs,http,jasmine,Angularjs,Http,Jasmine,我已经读了几篇文章,但仍然不能为我找到解决办法。我有一个角度服务 App.factory('PoolService', ['$http', '$q', function($http, $q){ return { fetchAllPools: function() { return $http.get('http://localhost:5555/demo/pools/').then( ... 还有一个角度控制器,

我已经读了几篇文章,但仍然不能为我找到解决办法。我有一个角度服务

App.factory('PoolService', ['$http', '$q', function($http, $q){
    return {
        fetchAllPools: 
            function() {
                return $http.get('http://localhost:5555/demo/pools/').then( ...
还有一个角度控制器,它使用服务

App.controller('PoolController', ['$scope', 'PoolService', function($scope, PoolService) {
          var self = this;
          self.pool={id:null,name:'', description:''};
          self.pools=[]; ...
现在我正试图为控制器编写一个Jasmine单元测试,它看起来像:

describe('pool', function () {
    beforeEach(module('myApp'));

    var $controller;

    beforeEach(inject(function(_$controller_){
        $controller = _$controller_;
    }));

    describe('pool list', function () {

        it('after fetching pools the pool list should contain elements', function () {
            var $scope = {};
            var controller = $controller('PoolController', { $scope: $scope});

            controller.fetchAllPools();

            expect($scope.pools).toBeDefined();
        });
    });
});
fetchAllPools()的实现

我的问题是服务不执行http.get请求——它只是在无休止地等待

有人能帮忙吗?我做错了什么


谢谢

在控制器测试中模拟服务:

it('after fetching pools the pool list should contain elements', inject(function(PoolService, $q, $rootScope) {
  var $scope = $rootScope.$new();
  spyOn(PoolService, 'fetchAllPools').and.returnValue($q.when([]));
  var controller = $controller('PoolController', { $scope: $scope });

  controller.fetchAllPools();
  $scope.$apply();

  expect($scope.pools).toBeDefined();
});

它是angular还是angular js?您可以共享controller.fetchAllPools()的实现吗?它是angular js。下面是fetchAllPools的实现:fetchAllPools:fetchAllPools:function(){return$http.get('(函数(响应){return response.data;},函数(errResponse){console.error('error while fetching pools');return$q.reject(errResponse);});},非常感谢,http请求现在已执行!我的测试仍然失败:Chrome 58.0.3029(Mac OS X 10.11.6)池池列表获取池后池列表应包含未定义的元素。at Object。(/…pool.test.js:31:27)at Object.e[as invoke](lib/angular.min.js:38:477)at Object.workFn(lib/angularmocks.js:2420:20)它不可能被执行,因为上面代码的全部要点是模拟服务,即用返回空数组的伪实现替换其实际实现。即使调用了真正的服务,$httpBeckend服务本身也会被单元测试模拟:我明白了!非常感谢!有没有办法测试http服务我已经给了你一个链接,解释了如何使用$http测试代码。
it('after fetching pools the pool list should contain elements', inject(function(PoolService, $q, $rootScope) {
  var $scope = $rootScope.$new();
  spyOn(PoolService, 'fetchAllPools').and.returnValue($q.when([]));
  var controller = $controller('PoolController', { $scope: $scope });

  controller.fetchAllPools();
  $scope.$apply();

  expect($scope.pools).toBeDefined();
});