Как я могу проверить директиву для события загрузки?

Итак, я сделал эту простую директиву

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();
});
Другие вопросы по тегам