加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 07:37:51 所属栏目:安全 来源:网络整理
导读:我有一个使用隔离范围的数据传递给随时间变化的指令的指令.它监视该值的变化,并对每个变化进行一些计算.当我尝试对该指令进行单元测试时,我无法得到手表触发(为简洁起见,但基本概念如下所示): 指示: angular.module('directives.file',[]).directive('file
我有一个使用隔离范围的数据传递给随时间变化的指令的指令.它监视该值的变化,并对每个变化进行一些计算.当我尝试对该指令进行单元测试时,我无法得到手表触发(为简洁起见,但基本概念如下所示):

指示:

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);
    }
  };
});

测试:

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()来访问指令范围:

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

这个jsFiddler就是这个例子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读