运行使用使用Widget工厂构建的jQuery插件的jasmine规范时的TypeError

时间:2011-12-06 11:49:37

标签: javascript jquery jasmine jasmine-jquery

我正在使用名为toggleEdit的jQuery插件进行内联编辑。

当代码实际用于页面时,一切正常。

但是,我的测试套件失败并出现以下错误:

TypeError: Cannot call method 'remove' of undefined

我跟踪它是从这个特定插件的clear方法中触发的。其源文件可以找到here

该代码中有两个相关位:

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函数尝试访问该结构并检索该元素。那时,在茉莉花规格内,它失败了上述例外。

有没有人见过类似的东西?

编辑:

这是我的规范,它是能够重现错误的最简单的代码:

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 :(得分:0)

我正在查看toggleEdit的源代码,似乎只调用了函数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);
       }    

由于第一次呼叫似乎受到保护,我问你一个有点愚蠢的问题:是否有可能两次调用destroy?

答案 1 :(得分:0)

发现我的问题:旧版jQuery + jQuery UI duo。升级它们可以解决异常。