У меня есть простая директива, которая добавляет или удаляет класс focus
к элементу на основе свойства scope
директивы.
Я бы хотел написать 2 теста.
Сначала проверьте, что класс focus
включен в элемент, когда для свойства scope.addFocus
установлено значение 'true'
. Этот тест проходит.
Затем я обновляю скомпилированный шаблон директивы, меняю свойство scope.addFocus
на 'false'
, запускаю $digest()
и ожидаю, что директива обновит классы элемента и удалит класс focus
. Этот тест не пройден.
Вот ссылка на plunkr: http://plnkr.co/edit/k4PBcCwfivsJsbIEUwGd?p=preview
Есть идеи, почему $compiledTemplate.attr('add-focus', 'false'); $directiveScope.$digest();
не будет обновлять классы обновления должным образом?
Код директивы
myApp.directive('myDirective', function() {
return {
scope: {
addFocus: '@'
},
restrict: 'A',
link: function (scope, element, attr) {
scope.$watch(
function() { return scope.addFocus; },
function (newValue, oldValue) {
if (newValue === 'true') {
element.addClass('focus');
} else {
element.removeClass('focus');
}
},
false
);
}
};
});
Испытания
describe('myApp', function () {
var $compile, $timeout, $rootScope;
var $directiveScope;
var template = '<div my-Directive add-focus="true"></div>';
var $compiledTemplate;
beforeEach(function () {
module('myApp');
});
beforeEach(angular.mock.inject(function(_$compile_, _$timeout_, _$rootScope_) {
$compile = _$compile_;
$timeout = _$timeout_;
$rootScope = _$rootScope_;
}
));
beforeEach(function() {
$directiveScope = $rootScope.$new();
$compiledTemplate = $compile(template)($directiveScope);
$directiveScope.$digest();
});
// Test 1
it('directive is compiled and has focus class', function() {
console.log('test1', $compiledTemplate[0]);
expect($compiledTemplate.hasClass('focus')).toBe(true);
});
// Test 2
it('focus class is removed', function() {
$compiledTemplate.attr('add-focus', 'false');
$directiveScope.$digest();
$timeout(function() {
console.log('test2', $compiledTemplate[0]);
expect($compiledTemplate.hasClass('focus')).toBe(false);
}, 0);
$timeout.flush();
});
});