Протестируйте директивную функцию через часы

У меня есть функция в угловой директиве, которая срабатывает на часах. Как проверить активность прокрутки функции scroll на основе тайм-аута, поскольку она не входит в область действия?

scope.$watch('elementId', function(value) {
    //How do i test scroll function contents?
    scroll(element, value);
});

function scroll (pE, element) {
   console.log('Here');
   $timeout(function afterTimeout () {
     var scrollTo = $('#' + element);
     var container = $(pE);
     container.animate({scrollTop : scrollTo[0].offsetTop - container[0].offsetTop - 10}, 'slow');
   }, 250);
}

Подробный код находится здесь http://jsfiddle.net/QGmCF/68/.


person meteor    schedule 30.09.2016    source источник
comment
Модульное тестирование реального DOM — не очень приятная задача. См. этот stackoverflow.com/a/37527210/3731501 о том, как тестировать вызовы $timeout. Поскольку он не входит в область действия, вы уже знаете, что было бы проще протестировать его, если бы он был в области видимости. Предоставьте функцию scroll как метод области/контроллера, это улучшит тестируемость.   -  person Estus Flask    schedule 01.10.2016
comment
Ах хорошо .. посмотрю на это .спасибо!   -  person meteor    schedule 05.10.2016


Ответы (1)


У меня есть несколько предложений по очистке вашего кода. Первое, что нужно понять, это то, что вы должны внедрить фиктивный объект $timeout в свой тест и вызвать $timeout.flush(251), чтобы убедиться, что ваш код работает.

Как это:

it('test watch', inject(function($compile, $rootScope, $timeout) {
    // as before
    $timeout.flush(251);
    // test that your code has run
}));

Еще одно предложение: вместо использования объекта $ jQuery используйте $window.document или $document[0] для доступа к собственным компонентам браузера. При этом вы можете написать это:

var scrollTo = $document[0].getElementById(element);

и тогда вам больше не нужно обращаться к элементу scrollTo с помощью [0].

person Andrew Eisenberg    schedule 04.10.2016