在$attr上测试$watch的角度单元

angular unit testing a $watch on an $attr

本文关键字:单元 测试 attr watch      更新时间:2024-06-25

根据我的理解$attr$观察一次火灾。因此,有时在属性上使用$watch。我正在寻找一个需要ngModel的指令的单元测试

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

由于这是在Link函数中使用scope,所以我似乎可以调用$digest。

我的模拟属性开始是这样的…

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

我不确定我是否可以在规范中重新定义element.attr('min-length')并运行$digest,或者是否有更复杂的方法,因为手表正在传递一个新值。

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

 $rootScope = $rootScope.$new();
 element = $compile(html)($rootScope);
 $rootScope.$digest(element);
 controller = element.controller('ngModel');
 scope = element.scope();

我以前没有在属性上测试过$watch,所以如果有任何方向能让我解决这个问题,我将不胜感激。

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

它可以作为任何其他范围观察程序进行测试:

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

据我所知$attr$观察一次火灾。

不,$attrs.$observe观察器会在每次属性更改时触发,这比$scope.$watch更可取。如手册所述,

使用$observe观察包含插值(例如src="{{bar}}")。这不仅非常有效但这也是容易获得实际值的唯一方法,因为在链接阶段,尚未评估插值因此该值此时被设置为未定义。

问题是属性属于DOM,不能干净地进行测试。对于控制器规范,$attrs局部依赖性可以被模拟,但在指令规范中是不可能的。出于可测试性的原因,最好将属性绑定到作用域属性,并且只在不涉及$attrs的情况下测试作用域。