TypeError lors de l'exécution de spécifications jasmine qui utilisent un plugin jQuery construit à l'aide de la fabrique de widgets
-
28-10-2019 - |
Question
J'utilise un plugin jQuery appelé toggleEdit pour l'édition en ligne.
Tout fonctionne correctement lorsque le code est réellement utilisé dans la page.
Cependant, ma suite de tests échoue avec l'erreur suivante:
TypeError: Cannot call method 'remove' of undefined
Je l'ai suivi pour être déclenché à partir de la méthode clear
de ce plugin particulier. Son fichier source est disponible ici .
Il y a deux bits pertinents dans ce code:
1- La fonction _init
self.element.addClass("toggleEdit toggleEdit-edit toggleEdit-edit-" +
self._tag(self.element))
//store reference to preview element
.data("toggleEdit-preview", self.p);
Comme vous pouvez le voir, lorsque le plugin est instancié pour la première fois, il utilise la structure data
sur self
pour stocker l'élément nouvellement créé.
2- La fonction clear
self.element.data("toggleEdit-preview").remove();
La fonction clear
essaie alors d'accéder à cette structure et de récupérer l'élément. C'est alors que, à l'intérieur d'une spécification jasmin, il échoue avec l'exception susmentionnée.
Quelqu'un a-t-il vu quelque chose de similaire?
MODIFIER:
Voici mes spécifications, c'est le morceau de code le plus simple capable de reproduire l'erreur:
it("should update the given attribute on the server", function(){
$('#user-details input, #user-details select').toggleEdit(); //this line triggers the error
});
http://alz.so/static/plugins/toggleedit/jquery. toggleedit.js
La solution 2
J'ai trouvé mon problème: ancienne version du duo d'interface utilisateur jQuery + jQuery.Leur mise à niveau résout l'exception.
Autres conseils
Je regardais la source de toggleEdit et il semble que les deux seules fois où la fonction clear est appelée, c'est juste avant que self.element.data ne soit défini:
if (typeof self.element.data("toggleEdit-preview") !== "undefined") {
self.clear();
self.disableEvents();
}
Et à la fonction destroy:
destroy: function() {
var self = this;
self.clear();
self.disableEvents();
$.Widget.prototype.destroy.apply(self, arguments);
}
Puisque le premier appel semble être protégé, je vous pose une question un peu stupide: est-il possible que destroy soit appelé deux fois?