2015-01-12 2 views
3

Я пытался найти способ тестирования этой части контроллера на несколько дней, но продолжаю застревать. Теперь я получаю ReferenceError: не могу найти переменную: $ modal, но у меня она была введена, поэтому я не уверен, почему она не работает. Я также знаю, что этот тест, который я пишу, на самом деле не проверяет ничего важного, поэтому, если у вас есть предложения по продвижению вперед, дайте мне знать. И спасибо всем, кто помог мне в коде на протяжении всего этого контроллерТестирование Bootstrap modal in Angular controller

Код:

$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; 
       } 
      } 
     }); 

Тест:

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, $q) { 
      spyOn($modal, 'open').and.returnValue({ 
       result: $q.defer().promise 
      }); 
     })); 

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

    }); 
+0

вы смотрели здесь? http://stackoverflow.com/a/21370703/1464112 – scniro

+0

У меня есть, что один и этот http://stackoverflow.com/questions/22905581/unit-test-service-that-returns-promise-angularjs-jasmine имеют помогли мне много, но я не могу заставить кусочки головоломки совмещаться. – ReganPerkins

ответ

3

Вам нужно установить режимные переменной для того, чтобы иметь возможность используй это.

т.е.

describe("confirmDelete() function", function() { 
    var controller, scope, $modal; //Initialize it here 

//.... 

beforeEach(inject(function ($rootScope, _$modal_, $controller) { 
     $modal = _$modal_; //Set it here 

И вам нужно впрыснуть $controller, а для того, чтобы иметь возможность использовать его.

Plnkr

+0

Я думал, что это может быть что-то вроде этого, но если я добавлю его, я получаю TypeError: «undefined» не является объектом (оценивая «$ modal.open») – ReganPerkins

+0

Вам также нужно ввести '$ controller'. Проверьте мою демоверсию. Держите ваш тест очень простым и исправьте его, сначала установив все эталонные проблемы, опечатки и т. Д., А затем улучшите тест и идите оттуда, я предлагаю. – PSL

+0

Я думал, что никогда не переживу этого. Спасибо! Теперь мне просто нужно прекратить делать ошибки новичков. – ReganPerkins