我正在尝试运行一些需要存根jQuery.ajax
的测试。我正在使用SinonJS来做到这一点,它曾经适用于旧版本的jQuery(1.x)
var $ = require('jquery');
var sinon = require("sinon");
sinon.stub($, "ajax"); // this worked because $.ajax is defined
然而,在升级到jQuery 2.x之后,当我需要从我的模块运行jquery时,我不得不包含一个窗口环境。我正在使用jsdom
来完成此任务:
var document = require('jsdom').jsdom(),
window = document.parentWindow,
$ = require('jquery')(window);
问题 $.ajax
现在未定义。我怀疑因为现在它返回绑定到特定元素但不完全确定的jQuery对象。有谁知道为什么以及如何解决这个问题?
编辑我的一位不在SO上的朋友指出,如果我们将window
附加到全局,我们可以获得普通的jquery对象而不是工厂
global.window = require('jsdom').jsdom().parentWindow;
var $ = require('jquery'); // this works as $.ajax is now defined
我不喜欢将窗口附加到全局,因为它会影响某些类型检查窗口的插件。不是阻挡者,但我很想知道是否还有其他方法可以解决这个问题。
答案 0 :(得分:7)
我可以发誓,在阅读jquery源代码之后,我在问这个问题的那天尝试了这个,但它没有用。我刚刚再次尝试,它正在工作。
tl; dr jQuery将$附加到浏览器模拟器的窗口命名空间。
var document = require('jsdom').jsdom(),
window = document.parentWindow;
require('jquery')(window);
var $ = window.$;
希望它对其他人有用。
答案 1 :(得分:0)
在节点中有几个选择来做请求:
1)使用jquery
var $ = require('jquery')(require("jsdom").jsdom().parentWindow);
// now $.ajax works well
2)使用npm请求 https://www.npmjs.com/package/request
3)使用原生对象XHR
我测试了这三个选项,最后我使用了包请求(以避免像jquery + jsdom这样的额外包)以及本地XHR的奇怪情况。