0

다른 장소에서 일부 DOM을 변경하기위한 컨트롤러가 있습니다.컨트롤러를 별도로 테스트하는 방법은 무엇입니까?

컨트롤러는 다음과 같습니다

angular.module('myModule').controller('myController', myController); 

function myController() { 
    this.addSomeClass = function() { 
     $('#idOfSomeElement').addClass('someClass'); 
    }; 
} 

을 그리고 그것은 다음과 같이 사용된다. 다른 구성 요소 및 HTML 내부.

<div id="idOfSomeElement"></div> 
. 
. 
. 
<some-angular-component-here> 
    <div ng-controller="myController as ctrl"> 
     <div ng-click="ctrl.addSomeClass()"></div> 
    </div> 
</some-angular-component-here> 
. 
. 
. 
<using-in-onother-place> 
    <div ng-controller="myController as ctrl"> 
     <div ng-click="ctrl.addSomeClass()"></div> 
    </div> 
</using-in-onother-place> 

나는 이것을 시험해 보려고하지만, 나는 정의되지 않은 ctrl을 가지고있다.

describe('Controller test', function() { 
    'use strict'; 

    var ctrl, 
     element; 

    beforeEach(inject(function ($rootScope, $compile) { 
     var scope = $rootScope.$new(); 
     angular.element('<div id="idOfSomeElement"></div>' + 
         '<div ng-controller="myController as ctrl">' + 
          '<div id="button" ng-click="ctrl.addSomeClass()"></div>' + 
         '</div>'); 

     element = $compile(element)(scope); 
     scope.$apply(); 

     // how to get controller here with linked to html? 
     ctrl = $controller('myController'); 
     ctrl = element.controller('myController'); 

    })); 

    it('should add some class', function() { 

     var button = $(element).find('#button')[0]; 
     $(button).trigger('click'); 

     var someElement = $(element).find('#idOfSomeElement')[0]; 
     expect(someElement).toHaveSomeClass(); 
    }); 
}); 

어떻게 이런 종류의 컨트롤러를 테스트 할 수 있습니까? 그리고 컨트롤러 안의 DOM을 조작하는 것은 나쁜 일이라는 것을 알고 있지만 단위 테스트를해야합니다.

감사

나는 당신이 당신의 요소 속성에 angular.element의 반환 값을 할당하는 것을 잊었다 생각
+0

DOM기구는 문서에서 분리되어'$ ('idOfSomeElement')'선택자는 조명기에 도달하지 않습니다. 최선의 방법은'$ (...)'을 조롱하는 것입니다 (jQuery'init' 메소드를 스텁하는 방법으로 할 수 있습니다.) (http://stackoverflow.com/a/36356692/3731501))와'addClass' 메쏘드를 호출하고 그들의 호출을 감시한다. 이것은 jQuery와 Angular를 혼합하는 것이 나쁜 이유 중 하나입니다. 그리고 네, 이것은 컨트롤러에서해서는 안됩니다. – estus

답변

0

...

element = angular.element(.... 

완전한 beforeEach : 테스트에서

beforeEach(inject(function ($rootScope, $compile) { 
    var scope = $rootScope.$new(); 
    element = angular.element('<div id="idOfSomeElement"></div>' + 
        '<div ng-controller="myController as ctrl">' + 
         '<div id="button" ng-click="ctrl.addSomeClass()"></div>' + 
        '</div>'); 

    element = $compile(element)(scope); 
    scope.$apply(); 

    // how to get controller here with linked to html? 
    ctrl = $controller('myController'); 
    ctrl = element.controller('myController'); 

})); 
+0

고마워, 나는 눈먼 바보 야) –

관련 문제