通过手表测试指令功能

时间:2016-09-30 22:08:53

标签: angularjs jasmine angular-mock

我在角度指令中有一个函数可以在手表上触发。如何测试函数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/

1 个答案:

答案 0 :(得分:1)

我有一些清理代码的建议。首先要注意的是,您应该将模拟$timeout对象注入测试并调用$timeout.flush(251)以确保代码运行。

像这样:

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

另一个建议:使用$$window.document来访问浏览器的本机组件,而不是使用jQuery的$document[0]对象。有了这个,你可以这样写:

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

然后您不再需要使用scrollTo访问[0]元素。