Was ist ein guter Weg, um isolierte Bereiche in AngularJS zu testen?
Direktiven-Snippet
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);
});
}
Ich möchte sicherstellen, dass die Richtlinie auf Änderungen wartet - dies funktioniert nicht mit einem isolierten Bereich:
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));
});
UPDATE: Ich habe es zum Laufen gebracht, indem ich überprüft habe, ob die erwarteten Beobachter zum untergeordneten Bereich hinzugefügt wurden, aber es ist sehr spröde und verwendet die Accessoren wahrscheinlich auf undokumentierte Weise (auch bekannt als Änderungen vorbehalten!).
//this is super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.scope().$$watchers[0].exp).toBe('name');
UPDATE 2:
Wie gesagt, das ist spröde! Die Idee funktioniert immer noch, aber in neueren Versionen von AngularJS hat sich der Accessor von geändert scope()
zu isolateScope()
:
//this is STILL super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.isolateScope().$$watchers[0].exp).toBe('name');