Test de l'élément de la directive - ne peut pas accéder isolé champ d'application de méthodes au cours de tests
J'ai la directive suivante.
directivesModule.directive('wikis', function() {
var urlRegex = new RegExp('^(https?)://.+$');
return {
restrict: 'E',
templateUrl: 'templates/wiki-list.html',
scope: {
wikis: '='
},
link: function(scope, element, attrs) {
scope.newWikiURL = '';
scope.$watch('wikis', function() {
if (scope.wikis == undefined || scope.wikis.length === 0) {
scope.class = 'hide';
} else {
scope.class = 'show';
}
}, false);
scope.addWiki = function() {
if (scope.wikis == undefined) {
scope.wikis = [];
}
var nw = scope.newWikiURL;
if (nw != undefined && nw.trim() != '' && urlRegex.exec(nw)) {
scope.wikis.push(nw);
scope.newWikiURL = '';
}
}
}
};
});
Quand je l'ai tester:
describe('Wikis Directive Test Suite', function() {
var scope, elem, directive, linkFn, html;
beforeEach(function() {
html = '<wikis wikis=''></wikis>';
inject(function($compile, $rootScope) {
scope = $rootScope.$new();
scope.wikis = [];
elem = angular.element(html);
$compile(elem)(scope);
scope.$digest();
});
});
it('add Wiki should add a valid wiki URL to artist', function() {
var url = 'http://www.foo.com';
scope.newWikiURL = url;
scope.addWiki();
expect(scope.wikis.length).toBe(1);
expect(scope.wikis[0]).toBe(url);
expect(scope.newWikiURL).toBe('');
});
});
Je reçois un message d'erreur indiquant que l'Objet n'a pas de addWiki méthode. J'ai essayé de déboguer, et la fonction de lien n'est pas appelé pendant le test. Je pense que c'est pourquoi le addWiki méthode ne fait pas partie de la portée. Quelqu'un sait pourquoi j'obtiens cette erreur?
En passant, Est-ce une pratique normale pour ajouter un peu de logique dans la fonction de lien d'une directive comme il serait un Contrôleur lui-même? Parce qu'en regardant le code, je sais que c'est pourquoi, en réalité, je suis en train de faire.
Vous devez vous connecter pour publier un commentaire.
Vous devez charger le module contenant votre directive, sinon angulaire ne sais pas ce que
<wikis>
estVotre directive crée un isolat portée, donc une fois qu'il a été compilé vous avez besoin pour obtenir le nouveau champ d'application à l'aide de
elem.isolateScope()
Donc, avec ces changements:
http://jsfiddle.net/QGmCF/1/
$compile(elem)(scope);
doit êtrevar elem = $compile(elem)(scope);
scope = elem.isolateScope(); scope.$apply();
mauvais ordre de ces lignes. nous devrions fairescope.$apply();
premièreComme par angulaire 1.2.0 docs, la manière d'obtenir l'isoler champ d'application est par le biais de la méthode isolateScope
portée() - récupère le champ d'application de l'élément courant ou de son parent.
isolateScope() - récupère un isolat de portée si l'on est directement relié à l'élément courant. Cette getter doit être utilisé uniquement sur les éléments qui contiennent une directive qui commence une nouvelle isoler portée. L'appel de la portée() sur cet élément renvoie toujours l'original à la non-isoler portée.
Angulaire doc - section jQuery/jqLite Extras
MODIFICATION de RUPTURE: jqLite#étendue()
angular.element($elem).scope()
n'obtient pas l'isoler de la portée alors queangular.element($elem).isolateScope()
ne! T " a été très confus, sans cette tid bits. Merci @yeraycaballero!