Как я могу проверить директиву для события загрузки?
Итак, я сделал эту простую директиву
angular
.module('cherrytech.common', [])
.directive('ctOnload', function() {
return {
restrict: 'A',
scope: {
callback: '&ctOnload'
},
link: function(scope, element) {
element.on('load', function(event) {
scope.callback({ event: event });
});
}
};
});
и работает нормально, никаких проблем вообще нет. Обратный вызов вызывается с объектом события, когда элемент завершил загрузку. Я использую это для iframes, но должен работать на любом элементе, который поддерживает событие загрузки.
Но тогда я хотел проверить это. Я использую testem с конфигурацией по умолчанию и пробую этот простой тестовый код, но не могу заставить его работать:
describe('Directive: ctOnload', function() {
var element, scope;
beforeEach(module('cherrytech.common'));
beforeEach(inject(function($rootScope, $compile) {
scope = $rootScope;
element = '<iframe src="about:blank" ct-onload="loadCallback(event)"></iframe>';
scope.loadCallback = function(event) { console.log(event); };
element = $compile(element)(scope);
scope.$digest();
}));
it('should call the scope callback', function() {
spyOn(scope, 'loadCallback');
element.triggerHandler('load');
expect(scope.loadCallback).toHaveBeenCalled();
});
});
Обычно у меня нет каких-либо проблем с директивами тестирования, но обратный вызов этого события сводит меня с ума. Независимо от того, что я делаю, я не могу получить событие загрузки для запуска теста. Если я заменю ct-onload на ng-click и вызову событие click, тогда все будет работать как положено. Что, черт возьми, здесь происходит? Это проблема с тестемом?
2 ответа
Я решил убить testem и вернуться к карме с помощью Chrome Launcher. Теперь все работает как надо.
Ты позвонишь digest
сообщить в angular, что что-то изменилось:
element.on('load', function(event) {
scope.callback({ event: event });
scope.$digest();
});