TypeError lors de l'exécution de spécifications jasmine qui utilisent un plugin jQuery construit à l'aide de la fabrique de widgets

StackOverflow https://stackoverflow.com/questions/8399427

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

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top