2015-01-13 4 views
1

계속 오류가 발생합니다. [$ injector : unpr] 알 수없는 공급자 : modalInstanceProvider < - modalInstance 이 테스트에서 계속 전진 할 수있을 것 같은 느낌이 들지만 계속 붙어있어. 아무도 내가 팁을 주시면 감사하겠습니다. 나는 운이없는이 시험에 며칠을 보냈다.

감사

Ctrl 키를 테스트

describe('DeleteModalController', function() { 
    //make module avalible to tests 
    beforeEach(module('pb.accounts.controllers')); 
    beforeEach(module('ui.router')); 
    beforeEach(module('ui.bootstrap')); 

    var $controller; 
    var mockGlobal = { activeOrganizationId: 0 }; 
    var mockStateParams = { orgId: 1, entityId: null }; 
    var mockForm = {}; 
    var mockState = {}; 

    var mockAccountSrv = { 
     account: { 
      entityId: 2, 
      page: 19, 
      length: 200 
     }, 
     accounts: { 
      entityId: 2, 
      page: 19, 
      length: 200 
     } 
    }; 

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

    describe("Account service delete() function", function() { 
     var controller, scope; 


     // sets scope of controller before each test 
     beforeEach(inject(function ($rootScope, _$modal_, _$modalInstance_) { 
      scope = $rootScope.$new(); 
      controller = $controller('DeleteModalController', 
       { 
        $modal: _$modal_, 
        modalInstance: _$modalInstance_, 
        $scope: scope, 
        $stateParams: mockStateParams, 
        $state: mockState, 
        global: mockGlobal, 
        accountService: mockAccountSrv 
       }); 
     })); 


     it("make sure service promise resolves", function() { 
      scope.delete(mockAccountSrv.account); 
      spyOn(modalInstance, "close"); 
      scope.$digest(); 

      expect(modalInstance.close).toHaveBeenCalled(); 
     }); 

    }); 

}); 

DeleteCtrl

angular.module('pb.accounts.controllers') 
.controller('DeleteModalController', ['global', '$scope', 'accountService', '$modal', '$modalInstance', 'account', function (global, $scope, accountService, $modal, $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'); 
    }; 
}]); 

계정 Ctrl 키

angular.module('pb.accounts.controllers') 
    .controller('AccountsController', ['$scope', '$q', '$stateParams', '$state', '$timeout', '$modal', 'global', 'accountService', function ($scope, $q, $stateParams, $state, $timeout, $modal, global, accountService) { 

     var init = function() { 
      global.activeOrganizationId = $stateParams.orgId || 0; 
      $scope.global = global; 
      $scope.partialViews = { 
       form: "/app/accounts/views/_form.html" 
      }; 

      $scope.currentEntityId = $stateParams.entityId || 0; 
     }; 

     init(); 

     $scope.getAll = function (page, length) { 

      accountService.getAccounts(global.activeOrganizationId, page, length).then(function (data) { 
       $scope.accounts = data; 
      }); 

     }; 

     $scope.get = function (entityId) { 

      accountService.getAccount(global.activeOrganizationId, entityId).then(function (data) { 
       $scope.account = data; 
      }); 

     }; 

     $scope.add = function (form, account) { 
      form.submitIfValid(
       function() { 
        return accountService.createAccount(global.activeOrganizationId, account); 
       }).then(function (data) { 
        $state.go('accounts.campaigns.list', { orgId: global.activeOrganizationId, accountId: data.entityId }); 
       }); 
     }; 

     $scope.edit = function (form, account) { 
      form.submitIfValid(
       function() { 
        return accountService.updateAccount(global.activeOrganizationId, account) 
       }).then(function (data) { 
        $state.go('accounts.campaigns.list', { orgId: global.activeOrganizationId, accountId: account.entityId }); 
       }); 
     }; 

     $scope.confirmDelete = function (account) { 

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


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

    }]); 

답변

4

$modalInstance$modal 호출의 일부로서 작성되는 일이며, 당신이 할 수 있도록 그것은, 글로벌 종속되지 않습니다 : 당신이해야 할 일은

beforeEach(inject(function ($rootScope, _$modal_, _$modalInstance_) {

입니다 $modalInstance 더미 또는 $modalInstance과 같은 기능을 가진 스파이를 만듭니다. 이 같은

뭔가 :

modalInstance = {     // Create a mock object using spies 
     close: jasmine.createSpy('modalInstance.close'), 
     dismiss: jasmine.createSpy('modalInstance.dismiss'), 
     result: { 
      then: jasmine.createSpy('modalInstance.result.then') 
     } 
     }; 

이 답변에서 드러내 Unit testing a modalInstance controller with Karma/Jasmine

0

나는 당신이 당신의 협력을 초기화 $modalInstance를 사용한다 가정 ntroller하지만 modalInstance

controller = $controller('DeleteModalController', { 
    $modal: _$modal_, 
    $modalInstance: _$modalInstance_, 
    $scope: scope, 
    $stateParams: mockStateParams, 
    $state: mockState, 
    global: mockGlobal, 
    accountService: mockAccountSrv 
}); 
관련 문제