单元测试一个AngularJS指令,用于监视具有隔离范围的属性

前端之家收集整理的这篇文章主要介绍了单元测试一个AngularJS指令,用于监视具有隔离范围的属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用隔离范围的数据传递给随时间变化的指令的指令.它监视该值的变化,并对每个变化进行一些计算.当我尝试对该指令进行单元测试时,我无法得到手表触发(为简洁起见,但基本概念如下所示):

指示:

@H_404_3@angular.module('directives.file',[]) .directive('file',function() { return { restrict: 'E',scope: { data: '=',filename: '@',},link: function(scope,element,attrs) { console.log('in link'); var convertToCSV = function(newItem) { ... }; scope.$watch('data',function(newItem) { console.log('in watch'); var csv_obj = convertToCSV(newItem); var blob = new Blob([csv_obj],{type:'text/plain'}); var link = window.webkitURL.createObjectURL(blob); element.html('<a href=' + link + ' download=' + attrs.filename +'>Export to CSV</a>'); },true); } }; });

测试:

@H_404_3@describe('Unit: File export',function() { var scope; beforeEach(module('directives.file')); beforeEach(inject(function ($rootScope,$compile) { scope = $rootScope.$new(); }; it('should create a CSV',function() { scope.input = someData; var e = $compile('<file data="input" filename="filename.csv"></file>')(scope); //I've also tried below but that does not help scope.$apply(function() { scope.input = {}; }); });

我可以做什么来触发手表,所以我的“在手表”调试声明被触发?我的“链接”在编译时被触发.

为了触发一个$watch,一个摘要循环必须发生在它定义的范围上,或者在它的父项上.由于您的指令创建了一个隔离范围,因此它不会从父范围继承,因此在您调用适用范围上的$apply之前,其观察者将不会被处理.

您可以通过对$compile服务返回的元素调用scope()来访问指令范围:

@H_404_3@scope.input = someData; var e = $compile('<file data="input" filename="filename.csv"></file>')(scope); e.isolateScope().$apply();

这个jsFiddler就是这个例子.

原文链接:https://www.f2er.com/angularjs/142609.html

猜你在找的Angularjs相关文章