gpt4 book ai didi

javascript - 如何用 Jasmine 模拟 JQuery?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:06:08 25 4
gpt4 key购买 nike

如何测试某个 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 看到的。

最佳答案

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

// The jQuery object is actually just the init constructor 'enhanced'

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

return jQuery.merge( this, selector );

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

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

关于javascript - 如何用 Jasmine 模拟 JQuery?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7742435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com