通过手表测试指令功能

问题描述:

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

单元测试真正的DOM并不是很令人愉快的任务。有关如何测试$超时呼叫的信息,请参阅http://*.com/a/37527210/3731501。由于它不在范围内,因此您已经知道测试它是否在范围上会更容易。将'scroll'函数暴露为范围/控制器方法,这将有利于可测试性。 – estus

+0

啊好的..请看看这个。谢谢! – prem89

我有几个建议来清理你的代码。首先要认识到的是,您应该将模拟$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); 

,然后你不再有[0]访问您scrollTo元素。