在节点环境中对jQuery.ajax进行存根(jQuery 2.x)

时间:2015-04-29 13:20:20

标签: javascript jquery node.js

我正在尝试运行一些需要存根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

我不喜欢将窗口附加到全局,因为它会影响某些类型检查窗口的插件。不是阻挡者,但我很想知道是否还有其他方法可以解决这个问题。

2 个答案:

答案 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的奇怪情况。