4

如何测试某个 JQuery 选择器是否已使用 Jasmine 执行?我正在尝试执行以下操作:

spyOn($.fn, 'init').andCallThrough(); 
// my code
expect($.init).toHaveBeenCalled();

但是在这个调用之后,$('div')返回Object { selector="div", context=document, NaN=div.spec, more...},虽然它必须返回(并且$.fn.init('div')确实返回它)[div.jasmine_reporter, div.banner, div.logo, 4 more...]:。这些东西自然会破坏代码,因为 JQuery 对象不再可用。

例子:

假设我想测试一个 JQuery 选择器已被调用,我写道:

    it('tests', function() {
        spyOn($.fn, 'init').andCallThrough();
        $('html');
        expect($.init).toHaveBeenCalled();
    });

这导致 Jasmine 出现错误:Error: Expected a spy, but got undefined.. 然后我在 $('html') 行的 FireBug 中设置了一个断点,当我到达那里并尝试观察时$('html'),我得到的值是什么:

Object { selector="html", context=document, NaN=html, more...}

如果我注释掉spyOn,那一行$('html')的计算结果为:

[html]

这也是我期望看到的spyOn

4

1 回答 1

3

好吧,看起来 Jasmine 通过用包装的版本替换被监视的对象来进行间谍活动,这似乎把 jQuery 作为一个整体搞砸了,因为(来自 jQuery 源代码):

// jQuery 对象实际上只是 init 构造函数“增强”

我建议尝试监视 init 使用的功能之一,特别是“合并”。如果您查看 jQuery 代码,您会看到任何 HTML=>DOM 内容最终都会通过合并调用返回:

return jQuery.merge( this, selector );

(如果您碰巧正在查看 jQuery 1.5.1 的源代码,那就是第 152 行)。

通过监视合并,您应该能够测试您正在测试的任何内容,而不会无意中替换 jQuery 的内容。

于 2011-10-13T17:52:03.960 回答