Comment l'Unité de Test Isolé Champ d'application de la Directive dans AngularJS

Ce qui est un bon moyen de l'unité de test isolé portée dans AngularJS

JSFiddle montrant l'unité de test

Directive extrait de

    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);
        });
    }

Je veux m'assurer que la directive est à l'écoute de modifications - ce qui ne pas travail isolé portée:

    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));
    });

Mise à JOUR:
Je l'ai eu à travailler en vérifiant si la durée d'observateurs ont été ajoutés à l'enfant, mais il est très fragile et probablement en utilisant les accesseurs sans papiers moyen (aka sujets à changement sans préavis!).

//this is super brittle, is there a better way!?
elm = compile(validHTML)(scope);
expect(elm.scope().$$watchers[0].exp).toBe('name');

Mise à JOUR 2:
Comme je l'ai mentionné c'est fragile! L'idée fonctionne toujours, mais dans des versions plus récentes de AngularJS l'accesseur a changé à partir de scope() à isolateScope():

//this is STILL super brittle, is there a better way!?
elm = compile(validHTML)(scope);                       
expect(elm.isolateScope().$$watchers[0].exp).toBe('name');
  • Avez-vous trouver un moyen pour l'installation de l'espionnage?
  • pas vraiment, comme avant il y a un moyen de le faire fonctionner mais c'est sujet à changement sans préavis afin de les utiliser à vos propres risques.
InformationsquelleAutor daniellmb | 2013-06-28