Jasmine unit test for angular service In controller

£可爱£侵袭症+ 提交于 2020-01-23 13:17:09

问题


I'm new to jasmine framework. I've gone through some tutorials and learned and started writing unit tests. 'facing one issue here is the description. I have a controller where i can invoke a service call to get the data. See the code below.

$scope.getEmpInfo = function() {
  EmpService.getInfo($scope.empid)
     .then(function(data) {
        $scope.empData  = data;
        $scope.populateEmpData($scope.empData);
     }, function(reason) {
        //do nothing
    } 
}

Now, i want to write a unit test for the above method. Im able to make a spy on serice using promise but i wasnt able to spy $scope.populateEmpData(). here is my test case.

    describe('Emp data', function() {
       var d, scope;
       beforeEach(function() {
          module("emp");
          module("emo.info");
       });
       describe('empcontroller', function() {
          beforeEach(inject(function($q,_EmpService_, $controller,$rootScope){
              d = $q.defer();
              empService = _EmpService_;
              spyOn(empService,"getInfo").and.returnValue(d.promise);
              scope = $rootScope.$new();
              empCtrl = $controller("empController", {
                $scope: scope,
              });
           }));
         it('should get the Employee information ', function() {
                scope.getEmpInfo();
                spyOn(scope,'populateEmpData');
                expect(EmpService.getInfo).toHaveBeenCalled();
                //Here im getting the error.
                expect(scope.populateEmpData).toHaveBeenCalled();
         });

       });
   });

Please help resolve this issue. Thanks in advance.


回答1:


It's because you are not resolving promise. You will have to make change in spyOn.

 - spyOn(empService,"getInfo").and.callFake(function() {
            return {
                  then : function(success, error) {
                     success();
                }  
         } }

Now, it will go into the success callback and will try to call $scope.populateEmpData();



回答2:


You're never resolving your promise. And you need to call $scope.$apply().

Why is this necessary? Because any promises made with the $q service to be resolved/rejected are processed upon each run of angular’s digest cycle. Conceptually, the call to .resolve changes the state of the promise and adds it to a queue. Each time angular’s digest cycle runs, any outstanding promises will be processed and removed from the queue. Unit Testing with $q Promises in AngularJS

Check it out above link it will help you.



来源:https://stackoverflow.com/questions/43898588/jasmine-unit-test-for-angular-service-in-controller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!