TypeError при запуске спецификаций jasmine, использующих плагин jQuery, созданный с использованием фабрики виджетов - PullRequest
0 голосов
/ 06 декабря 2011

Я использую плагин jQuery с именем toggleEdit для встроенного редактирования.

Все работает нормально, когда код действительно используется на странице.

Однако мой набор тестов завершается с ошибкой:

TypeError: Cannot call method 'remove' of undefined

Я разыскал его, чтобы вызвать изнутри clear метода этого конкретного плагина. Его исходный файл можно найти здесь .

В этом коде есть два соответствующих бита:

1- _init функция

self.element.addClass("toggleEdit toggleEdit-edit toggleEdit-edit-" +   
self._tag(self.element))
//store reference to preview element
.data("toggleEdit-preview", self.p);

Как вы можете видеть, когда плагин создается впервые, он использует структуру data в self для хранения вновь созданного элемента.

2- clear функция

self.element.data("toggleEdit-preview").remove();

Функция clear затем пытается получить доступ к этой структуре и извлечь элемент. Именно тогда, когда он находится внутри спецификации жасмина, он выходит из строя с вышеупомянутым исключением.

Кто-нибудь видел что-нибудь подобное?

EDIT:

Это моя спецификация, это самый простой фрагмент кода, способный воспроизвести ошибку:

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

Ответы [ 2 ]

0 голосов
/ 06 декабря 2011

Нашел мою проблему: старая версия дуэта jQuery + jQuery UI. Обновление их разрешает исключение.

0 голосов
/ 06 декабря 2011

Я смотрел на источник для toggleEdit, и кажется, что только 2 раза вызывается функция clear только перед тем, как self.element.data будет установлен:

if (typeof self.element.data("toggleEdit-preview") !== "undefined") {
     self.clear();
     self.disableEvents();
}

А при функции уничтожения:

destroy: function() {
         var self = this;
         self.clear();
         self.disableEvents();
         $.Widget.prototype.destroy.apply(self, arguments);
       }    

Поскольку первый вызов, кажется, защищен, я задаю несколько глупый вопрос: возможно ли, что уничтожение вызывается дважды?

...