2016-04-14 53 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的情況下測試範圍。