2016-02-16 3 views
0

У меня есть контроллер:Дразнящих угловой JS вызова службы в контроллере

(function() { 
    'use strict'; 
    angular.module('myApp').controller('myCtrl', function ($scope, myService) { 

     // Start -----> Service call: Get Initial Data 
     myService.getInitialData().getData(function (featureManagerdata) { 
      var serviceData = featureManagerdata; 
     }, function (error) { 
      showErrorMessage(error, 'getinitialdata');     
     }); 
    }); 
}()); 

Вот моя служба: Использование $ ресурса делает вызов на getInitialData с GetData в качестве пользовательской функции.

(function() { 
    'use strict'; 
    angular.module('myApp').factory('myService', ['$resource', myService]); 

    function myService($resource) { 
     var hostUrl = 'http://x.x.x.x/WebAPIDev'; 

     function getInitialData() { 
      var url = hostUrl + '/featuremanager/allfeatures'; 
      var options = { 
       getData: { 
        method: 'GET', 
        isArray: true 
       } 
      }; 
      return $resource(url, {}, options); 
     ); 

     return { 
      getInitialData: getInitialData 
     }; 
    } 
}()); 

Хотел проверить сервисный вызов в контроллер с помощью карма-жасмин:

TestMyCtrl:

describe('Test my controller', function() { 
    beforeEach(module('myApp')); 

    var scope, Ctrl, service; 

    angular.module('myApp').service('mockService', function($resource) { 
     getInitialData = function() { 
      return { 
       'featureId': 1 
      }; 
     } 
    }); 

    beforeEach(inject(function(_$controller_, $rootScope, mockService) { 
     scope = $rootScope.$new(); 
     Ctrl = _$controller_('myCtrl', { 
      $scope: scope, 
      service: mockService 
     }); 
    })); 

    it('should test get initial data', function() { 
     var response, mockUserResource, $httpBackend, result; 

     service.getInitialData().getData(function(data) { 
      response = data; 
      // verify data 
     }); 
    }); 
}); 

Это бросает ошибку, service.getInitialData не функционирует. Любая идея, почему это бросает ошибку или любого другого лучшего способ проверки вызова службы

ответ

1

В Угловом, есть некоторые различия между factory и service, проверьте Service vs Factory vs Provider in Angular, если вы хотите узнать больше об этом.

Один из них завод возврата в референтную Объект и сервис возвращает Instance

Так что, когда вы пытаетесь определить/глумиться функцию или свойство в заводе, вы возвращаете Object с именем свойства и но на обслуживании, вы должны установить его на this.

И за этого, вы должны вернуть объект, которые определяют функцию getData так, что он может быть вызван в последнем тесте. (Или он будет бросать Undefine не является функцией ошибка)

Так обновить TestMyCtrl в этом,

describe('Test my controller', function() { 
    beforeEach(module('myApp')); 

    var scope, Ctrl, service; 

    angular.module('myApp').service('mockService', function($resource) { 
     //set the function to this. 
     this.getInitialData = function() { 
      //return { 
      // 'featureId': 1 
      //}; 
      //return an object which defined getData function. 

      return { 
       getData: function(func) { 
        var data = { 
         featureId: 1 
        }; 
        //do something here if you want. 
        func(data); 
       } 
      }; 
     } 
    }); 

    beforeEach(inject(function(_$controller_, $rootScope, mockService) { 
     scope = $rootScope.$new(); 
     Ctrl = _$controller_('myCtrl', { 
      $scope: scope, 
      service: mockService 
     }); 
    })); 

    it('should test get initial data', function() { 
     var response, mockUserResource, $httpBackend, result; 

     service.getInitialData().getData(function(data) { 
      response = data; 
      // verify data 
     }); 
    }); 
}); 

Надеется, что это может ответить на ваш вопрос. :)

+0

Спасибо.Это работало :) – user2323308