2016-04-14 17 views
1

根据我的理解,$ attr。$观察到一次发生火灾。所以有时候在属性上使用$ watch。我期待的单元测试,需要ngModel

scope.$watch(attr.ngModel, function (newValue) { 
      minlength = parseInt(attr.minLength); 
      scope.minLengthValidator(newValue); 
     }); 

因为这好像我可以调用$消化Link功能使用范围指令。

我嘲笑属性开始是这样的...

html = angular.element("<input ng-model=\"myUnit\" min-length=\"3\">"); 

我不知道如果我可以重新定义element.attr(“最小长度”)我的规范的内部并运行$消化,或者自从手表通过新的价值以来,有一种更复杂的方法。

我的模拟设置的其余部分是像这样

$rootScope = $rootScope.$new(); 
element = $compile(html)($rootScope); 
$rootScope.$digest(element); 

controller = element.controller('ngModel'); 
scope = element.scope(); 

我没有让我的点对解决这将是非常赞赏的任何方向之前测试了$手表上的属性。

回答

2

scope.$watch(attr.ngModel, ...)将在myUnit scope属性上创建一个观察器。一旦创建了观察器,它不会绑定到ngModel属性值。

它可以测试任何其他范围守望者:

scope.myUnit = ...; 
$rootScope.$digest(); 
expect(scope.minLengthValidator).toHaveBeenCalledWith(...); 

从我的理解$ ATTR $观察触发一次。

不,$attrs.$observe观察者会对每个属性发生更改,最好是$scope.$watch。如the manual状态,

使用$观察,观察到含有 插值属性的值改变(例如SRC = “{{栏}}”)。这不仅是非常高效的 ,但它也是轻松获得实际值的唯一方法,因为 在链接阶段的插值尚未评估 ,所以此时的值设置为undefined。

问题是属性属于DOM,无法进行干净测试。对于控制器规格$attrs本地依赖性可能会被模拟,但在指令规范中是不可能的。出于可测性原因,最好将属性绑定到范围属性,并且仅在不涉及$attrs的情况下测试范围。