TypeError Al ejecutar especificaciones de jazmín que usan un complemento jQuery construido con la fábrica de widgets
-
28-10-2019 - |
Pregunta
Estoy usando un complemento jQuery llamado toggleEdit para edición en línea.
Todo funciona bien cuando el código se usa realmente en la página.
Sin embargo, mi suite de prueba falla con el siguiente error:
TypeError: Cannot call method 'remove' of undefined
Lo rastreé para ser activado desde el interior del clear
Método de este complemento en particular. Su archivo fuente se puede encontrar aquí.
Hay dos bits relevantes en ese código:
1- el _init
función
self.element.addClass("toggleEdit toggleEdit-edit toggleEdit-edit-" +
self._tag(self.element))
//store reference to preview element
.data("toggleEdit-preview", self.p);
Como puede ver, cuando el complemento se instancia primero usa el data
estructura sobre self
Para almacenar el elemento recién creado.
2- el clear
función
self.element.data("toggleEdit-preview").remove();
los clear
La función luego intenta acceder a esa estructura y recuperar el elemento. Fue entonces cuando, mientras está dentro de una especificación de jazmín, falla con la excepción antes mencionada.
¿Alguien ha visto algo similar?
EDITAR:
Esta es mi especificación, es la pieza de código más simple capaz de reproducir el error:
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
Solución 2
Encontré mi problema: versión antigua del duo JQuery + jQuery UI. Actualizarlos resuelve la excepción.
Otros consejos
Estaba echando un vistazo a la fuente de ToggleEdit y parece que las únicas 2 veces que la función se llama es justo antes de self.element.data se establece:
if (typeof self.element.data("toggleEdit-preview") !== "undefined") {
self.clear();
self.disableEvents();
}
Y en la función de destrucción:
destroy: function() {
var self = this;
self.clear();
self.disableEvents();
$.Widget.prototype.destroy.apply(self, arguments);
}
Dado que la primera llamada parece estar protegida, le hago una pregunta algo tonta: ¿es posible que la destrucción se llame dos veces?