2015-01-13 2 views
1

Я все время получаю ошибку: [$ injector: unpr] Неизвестный поставщик: modalInstanceProvider < - modalInstance Я чувствую, что им так близко, что я могу перейти от этого теста, но я продолжайте застревать. Если у кого-то есть какие-то советы, я был бы признателен. Я провел несколько дней на этом тесте без большой удачи.

Благодаря

Test 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'); 
    }; 
}]); 

Accounts 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 
}); 
Смежные вопросы