2

카르마와 재스민을 사용하여 확인 상자의 결과를 테스트하려면 어떻게해야합니까? 여기에 도움이되는 개인 덕분에 몇 가지 기본 테스트를 실행하고 있지만 ionicPopup을 조롱하는 데 어려움을 겪고 있습니다.단위 확인 팝업 테스트 이오니아 프레임 워크 카르마

모든 가능한 결과로 상자를 호출하는 ng-click에서 모든 방법을 테스트 할 수 있다면 이상적입니다.

보기 :

<button ng-click="openPopup()">Open Popup</button> 

컨트롤러 :

angular.module('starter.thisController', []) 

.controller('ThisCtrl', function($scope, $state, $timeout, $ionicPopup) { 
    $scope.openPopup = function() { 
     var openPopup = $ionicPopup.confirm({ 
      title: 'Confirm', 
      template: 'Are you sure?' 
     }); 

     openPopup.then(function(res) { 
      if(res) { 
      $scope.confirmClicked(); 
      } 
     }); 

     $timeout(function() { 
      openPopup.close(); 
      }, 5000); 
    }; 

    $scope.confirmClicked = function() { 
     alert("User Clicked Confirm!!!"); 
    }; 
}); 

현재 테스트 :

describe('This Controller', function() { 
    var scope, state, timeout, ionicPopup; 
    ionicPopup = jasmine.createSpyObj('$ionicPopup spy', ['confirm']); 

    beforeEach(module('starter.thisController')); 

    beforeEach(inject(function($rootScope, $controller) { 
     scope = $rootScope.$new(); 
     $controller('ThisCtrl', { 
      '$scope': scope, 
      '$state': state, 
      '$timeout': timeout, 
      '$ionicPopup': ionicPopup 
     }); 
    })); 

    describe('Popup', function() { 
     it('should be defined', function() { 
      expect(ionicPopup).toBeDefined(); 
     }); 
    }); 
}); 

당신이 제공 할 수있는 모든 도움을 주셔서 감사합니다 : D를.

답변

3

나는 동일한 문제가있어서 spyOn을 사용하여 해결했습니다. 나는 당신의 모범을 보완하려고 노력할 것입니다.

describe('This Controller', function() { 
    var scope, state, timeout, $ionicPopup, $q 

    beforeEach(module('starter.thisController')); 

    beforeEach(inject(function($rootScope, $controller, _$ionicPopup_, _$q_) { 
     scope = $rootScope.$new(); 
     $ionicPopup = _$ionicPopup_; 
     $q = _$q_; 
     $controller('ThisCtrl', { 
      '$scope': scope, 
      '$state': state, 
      '$timeout': timeout, 
      '$ionicPopup': $ionicPopup 
     }); 
    })); 

    describe('$scope.openPopup', function() { 

     it('should call confirmClicked function if ok is clicked in the confirm popup', function() { 
      var deferred = $q.defer(); 
      deferred.resolve(true); //ok is clicked 
      spyOn($ionicPopup, 'confirm').and.callFake(function(){return deferred.promise}); 
      scope.openPopup(); 
      scope.$digest(); 
      expect(scope.confirmClicked).toHaveBeenCalled(); 
     }); 

     it('should not call confirmClicked if cancel is clicked in the confirm popup', function() { 
      var deferred = $q.defer(); 
      deferred.resolve(false); //cancel is clicked 
      spyOn($ionicPopup, 'confirm').and.callFake(function(){return deferred.promise}); 
      scope.openPopup(); 
      scope.$digest(); 
      expect(scope.confirmClicked).not.toHaveBeenCalled(); 
     }); 
    }); 
}); 

가장 큰 차이점은 실제 $ ionicPopup을 삽입 한 다음 spyOn으로 동작을 재정의한다는 것입니다.

+0

감사합니다. @ FrancisA .. 내 거대한 시간을 저장했습니다 ... !! –

관련 문제