一尘不染

如何在指令的链接功能中测试行为

angularjs

在我的某些指令中,我正在向作用域添加函数以处理特定于该指令的逻辑。例如:

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

我该如何测试该功能?我到处搜索如何测试指令,但是发现的更多内容是测试元素上的更改。我当然可以在每次测试之前编译指令,但是每次都会覆盖我的范围。我想在我的范围更改属性时测试该功能。

有什么方法可以保留从指令定义返回的对象吗?然后,我可以直接调用链接函数并测试作用域上定义的每个函数的行为。有没有更好的方法来完成所有这些工作?

我正在使用Jasmine来运行测试,并且想要在describe函数中进行作用域设置,因此it对于同一个作用域数据,我可以具有多个功能。


阅读 209

收藏
2020-07-04

共1个答案

一尘不染

基本上,不是测试链接函数本身,而是以编程方式测试指令的结果。您要做的是将指令写到字符串中,并使用$compile它进行角度处理。然后,您测试输出以确保正确连接了所有设备。

Angular的资料中有很多很好的例子,例如如何对ngRepeat指令进行测试。

您可以看到他们在做什么,即设置指令,更改范围(在本例中为$rootScope)以确保它已被$digested,然后测试其输出的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);
 }));

因此,在你的情况下scope.doStuff功能,我不考什么它 ,这么多,因为我最好的测试无论它影响的范围,并且它随后进行的DOM元素。

2020-07-04