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 это плохо, но мне нужно его проверить.

Благодаря

+0

DOM светильников в тестах отделившись от документа, поэтому '$ ('# idOfSomeElement')' селектор не достигнет приспособления. Ваш лучший выбор - издеваться над '$ (...)' (скорее всего, это может быть сделано путем обнуления метода 'init' jQuery, как показано [здесь] (http://stackoverflow.com/a/36356692/3731501)) и 'addClass' и шпион по их вызовам. Это одна из причин, почему смешение jQuery с Angular - это плохо. И да, это не должно быть сделано в контроллере. – estus

ответ

0

Я думаю, что вы забыли присвоить возвращаемое значение angular.element вашей собственности элемента ...

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

Спасибо, я слепой идиот) –

Смежные вопросы