2016-04-14 9 views
1

私の理解から、$ attr。$は一度だけ発生します。ですから、属性に対して$ watchを使う時間があります。私はユニットテストにこれは私が$ダイジェストを呼び出すことができますようにそれはそうリンク機能にスコープを使用しているのでngModel

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

を要求する指令を探しています。

私の嘲笑属性はそうのように起動し...

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スコーププロパティでウォッチャを作成します。ウォッチャが作成されると、それはngModel属性値にバインドされません。

それは他のどのスコープウォッチャーとして試験することができます。私の理解の$ attrのから

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

$一回火を観察します。

いいえ、$attrs.$observeいいえ、$attrs.$observeオブザーバは、各属性の変更時に起動します。$scope.$watchです。 the manualとして状態、

使用$は 補間(例えばSRC = "{{バー}}")を含む属性の値の変化を観察する観察します。これは非常に効率的ですが、 リンクフェーズ中に補間がまだ評価されていないため、 と値が未定義に設定されているため、実際の値を簡単に取得する唯一の方法です。

問題は、属性がDOMに属し、きれいにテストできないことです。コントローラ仕様の場合、$attrsローカル依存関係は嘲笑される可能性がありますが、ディレクティブ仕様では不可能です。テスト容易性の理由から、スコーププロパティに属性をバインドし、$attrsが含まれていない場合にのみスコープをテストすることが望ましいです。

関連する問題