2015-01-11 5 views
0

다음은 단위 테스트를 시도하고있는 컨트롤러의 일부 코드입니다.하지만별로 운이 없습니다. 오류 : spyOn에서 account()에 대한 감시 대상 개체를 찾을 수 없습니다.라는 오류 메시지가 계속 나타납니다.

컨트롤러

$scope.confirmDelete = function (account) { 

     var modalInstance = $modal.open({ 
      templateUrl: '/app/accounts/views/_delete.html', 
      controller: function (global, $scope, $modalInstance, account) { 
       $scope.account = account; 

       $scope.delete = function (account) { 
        global.setFormSubmitInProgress(true); 
        accountService.deleteAccount(global.activeOrganizationId, account.entityId).then(function() { 
         global.setFormSubmitInProgress(false); 
         $modalInstance.close(); 
        }, 
        function (errorData) { 
         global.setFormSubmitInProgress(false); 
        }); 

       }; 

       $scope.cancel = function() { 
        global.setFormSubmitInProgress(false); 
        $modalInstance.dismiss('cancel'); 
       }; 
      }, 
      resolve: { 
       account: function() { 
        return account; 
       } 
      } 
     }); 

     modalInstance.result.then(function (asset) { 
      $scope.getAll(1, 100); 
     }, function() { 
      console.log('Modal dismissed at: ' + new Date()); 
     }); 
    }; 

테스트

describe("confirmDelete() function", function() { 
     var controller, scope; 

     // sets scope of controller before each test 
     beforeEach(inject(function ($rootScope, _$modal_) { 
      scope = $rootScope.$new(); 
      controller = $controller('AccountsController', 
       { 
        $scope: scope, 
        $stateParams: mockStateParams, 
        $state: mockState, 
        // below: in order to call the $modal have it be defined and send on the mock modal? 
        $modal: _$modal_, 
        //modalInstance: mockModalInstance, 
        global: mockGlobal, 
        accountService: mockAccountSrv 
       }); 
     })); 

     beforeEach(inject(function ($modal) { 
      spyOn($modal, 'open'); 
      spyOn(scope.modalInstance, "account"); 
     })); 

     it("make sure modal promise resolves", function() { 
      scope.confirmDelete(mockAccountSrv.account); 
      expect($modal.open).toHaveBeenCalled(); 
     }); 

    }); 

답변

3

문제는 두 번째 beforeEach 당신이 scope.modalInstance 감시하려고하는 이러한 필드가 존재하지 않는다는 것입니다. 따라서 재스민은 간첩 할 대상을 찾을 수 없습니다.

또 다른 문제는 result 모달 약속이므로 TypeError를받지 않으려면 모의에게 반환하겠다고 말한 것입니다.

beforeEach(inject(function ($modal, $q) { 
    spyOn($modal, 'open').and.returnValue({ 
     result: $q.defer().promise 
    }); 
) 

다음 단계는 단위 테스트에서 해결할 수있는 약속을 되 돌리므로 해결되거나 거부 될 때 올바른 동작을 확인할 수 있습니다. 그런 식으로 모달 창 닫기를 시뮬레이션 할 수 있습니다.

Jasmine docs의 스파이에 대해 자세히 알아보십시오.

또한 모달 서비스를 컨트롤러에 삽입 할 필요가 없음을 유의하십시오 (이는 $modal: _$modal_ 라인을 의미 함). 서비스는 싱글 톤입니다. 당신이 그것의 어떤 경우에 간첩 할 때, 그것은 그것을 도처에 간첩 할 것입니다.

+0

이제 TypeError를 제외하고는 의미가 있습니다. 'undefined'는 (modalInstance.result를 평가하는) 객체가 아닙니다. 나는 내가 가짜 모의 모달을 만들어야한다고 생각하고 있었지만 아직 일을하지 못하는 것 같다. 나는 또한 오류를 없애기 위해 아래의 코드를 가지고 있었고 올바른 길에 있었습니까? mockModalInstance.result = function (promiseHandler) { return promiseHandler(); }; – ReganPerkins