如何测试指令的link函数中的行为

dnc*_*253 47 javascript jasmine angularjs

在我的一些指令中,我正在向作用域添加函数来处理特定于指令的逻辑.例如:

link: function(scope, element, attrs) {
         scope.doStuff = function() {
            //do a bunch of stuff I want to test
         }        
      }
Run Code Online (Sandbox Code Playgroud)

我该如何测试该功能?我搜索了如何测试指令,但我发现的更多是关于测试元素的更改.我可以在每次测试之前编译我的指令,但这样每次都会消灭我的范围.我想测试该函数作为我的范围更改中的属性.

有没有办法获取从指令定义返回的对象?然后我可以直接调用链接函数并测试作用域上定义的每个函数的行为.有没有更好的方法来做这一切?

我正在使用Jasmine运行我的测试,我想在describe函数中设置我的示波器,所以我可以it为相同的示波器数据提供多个函数.

Ben*_*esh 45

基本上,您不是测试链接函数本身,而是以编程方式测试指令的结果.你要做的是将指令写出一个字符串,并用$compile它来对它进行角度处理.然后测试输出以确保所有内容都正确连接.

Angular的源代码充满了如何做到这一点的好例子...例如Angular对ngRepeat指令的测试

您可以看到他们正在做的是设置指令,更改范围(在这种情况下$rootScope)确保它已$digest编辑,然后测试它输出的DOM以确保所有内容都正确连接.如果指令正在改变,你也可以测试范围内的内容.

对ngClick的测试也非常有趣,因为它显示了浏览器交互的测试及其对范围的影响.

为了完整起见,这里是ngClick测试的一个片段,我认为总结了相当好的测试指令:

 it('should get called on a click', inject(function($rootScope, $compile) {
   element = $compile('<div ng-click="clicked = true"></div>')($rootScope);
   $rootScope.$digest();
   expect($rootScope.clicked).toBeFalsy();

   browserTrigger(element, 'click');
   expect($rootScope.clicked).toEqual(true);
 }));
Run Code Online (Sandbox Code Playgroud)

所以在你的scope.doStuff函数的情况下,我不会测试它正在做什么,就像我测试它在范围上影响的任何东西一样,它随后影响了DOM元素.

  • 我的`doStuff`基本上只是更新我模型的不同部分.我希望能够分别对它所做的模型进行不同的更改,但这基本上意味着每次为每个模型重新设置模型`````````````````s)我只需要调整我想要测试它的方式,并且只需要一个`it`用于整个方法,并调整范围,因为我沿着不同的`expect` (2认同)
  • @Eugene - 它应该没有任何区别.每个测试的范围都是"新鲜的". (2认同)