#angularjs #karma-runner #karma-jasmine
#angularjs #karma-runner #karma-jasmine
Вопрос:
Я использую контроллер для изменения класса объекта в angularjs
$scope.$watch('sideQuery',function(){
if($scope.sideQuery==""){
$(".indicator").removeClass('glyphicon-minus');
$(".indicator").addClass('glyphicon-plus');
}
else{
$(".indicator").removeClass('glyphicon-plus');
$(".indicator").addClass('glyphicon-minus');
}
});
Как протестировать с помощью karma? функция, подобная
expect(scope.elem('.indicator').hasClass("glyphicon-plus")).toBe(true);
Ответ №1:
Пожалуйста, не используйте jQuery для переключения классов в Angular, это противоречит его цели. Используйте ng-class
и применяйте свои классы на основе флагов, например:
<div class="indicator" ng-class="{'glyphicon-minus' : sideQuery != '', 'glyphicon-plus':sideQuery == ''} ></div>
Затем при тестировании проверьте значение sideQuery
и знайте, что у вас будут классы, основанные на этом.
Комментарии:
1. Спасибо! 🙂 Как проверить, имеет ли элемент этот класс (‘glyphicon-plus’) или нет?
2. Не проверяйте элемент, проверьте эту переменную области видимости, если она пуста, у нее есть этот класс
plus
— elseminus
Ответ №2:
Если вы тестируете директиву, вы можете скомпилировать образец элемента и протестировать результирующий объект.
var $element;
beforeEach(inject(function ($compile) {
$element = $compile('<div data-my-directive></div>')($scope);
}));
it('should have the class "someClass"', function(){
expect($element.hasClass('someClass')).toBe(true);
});
Однако имейте в виду, что tymeJV прав, вы должны использовать ng-class
директиву и проверить значения вашей области. Если значение области действия правильное, то класс будет применен (вам не нужно тестировать ng-class
директиву, это делается в модульных тестах Angular).
Комментарии:
1. Я тестирую в контроллере, и он показывает ошибку ReferenceError: $compile не определен
2. Вам нужно будет внедрить службу $compile в
3. @Stranger, вы не должны использовать jQuery в контроллере, это то, что должно быть сделано в директиве. Что касается переменной $compile, она должна быть введена в функцию, в которой вы собираетесь ее использовать (я только что обновил код).
4. извините, что раздражаю вас. Он показывает …. beforeEach(inject(function ($compile) { $element = $compile(‘<div data-my-directive></div>’)(область видимости); })); Ошибка типа: undefined не является функцией с нулевым значением. <анонимный> Ошибка типа: scope.$element не является функцией
5. @Stranger, без проблем, довольно сложно писать код здесь в комментариях, взгляните на этот пример модульного тестирования директивы . scope.$element не существует… $element — это переменная, определенная внутри вашего теста.