在我的某些指令中,我正在向作用域添加函数以处理特定于该指令的逻辑。例如:
link: function(scope, element, attrs) { scope.doStuff = function() { //do a bunch of stuff I want to test } }
我该如何测试该功能?我到处搜索如何测试指令,但是发现的更多内容是测试元素上的更改。我当然可以在每次测试之前编译指令,但是每次都会覆盖我的范围。我想在我的范围更改属性时测试该功能。
有什么方法可以保留从指令定义返回的对象吗?然后,我可以直接调用链接函数并测试作用域上定义的每个函数的行为。有没有更好的方法来完成所有这些工作?
我正在使用Jasmine来运行测试,并且想要在describe函数中进行作用域设置,因此it对于同一个作用域数据,我可以具有多个功能。
describe
it
基本上,不是测试链接函数本身,而是以编程方式测试指令的结果。您要做的是将指令写到字符串中,并使用$compile它进行角度处理。然后,您测试输出以确保正确连接了所有设备。
$compile
Angular的资料中有很多很好的例子,例如如何对ngRepeat指令进行测试。
您可以看到他们在做什么,即设置指令,更改范围(在本例中为$rootScope)以确保它已被$digested,然后测试其输出的DOM以确保一切都正确连接。如果伪指令正在更改范围,那么您也可以测试范围中的内容。
$rootScope
$digest
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元素。
scope.doStuff