AngularJSで分離スコープを単体テストするための良い方法は何ですか
ディレクティブスニペット
scope: {name: '=myGreet'},
link: function (scope, element, attrs) {
//show the initial state
greet(element, scope[attrs.myGreet]);
//listen for changes in the model
scope.$watch(attrs.myGreet, function (name) {
greet(element, name);
});
}
ディレクティブが変更をリッスンしていることを確認したい-これは分離されたスコープでは機能しません:
it('should watch for changes in the model', function () {
var elm;
//arrange
spyOn(scope, '$watch');
//act
elm = compile(validHTML)(scope);
//assert
expect(scope.$watch.callCount).toBe(1);
expect(scope.$watch).toHaveBeenCalledWith('name', jasmine.any(Function));
});
更新: 予想されるウォッチャーが子スコープに追加されているかどうかを確認することで機能しましたが、非常に脆弱で、おそらく文書化されていない方法でアクセサーを使用しています(別名、予告なしに変更される可能性があります!)。
//this is super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.scope().$$watchers[0].exp).toBe('name');
更新2:
私が言ったように、これはもろいです!このアイデアは引き続き機能しますが、AngularJSの新しいバージョンでは、アクセサーがからscope()
に変更されていisolateScope()
ます。
//this is STILL super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.isolateScope().$$watchers[0].exp).toBe('name');