在节点环境中存储jQuery.ajax(jQuery 2.x)

我正在尝试运行一些需要存储jQuery.ajaxtesting。 我使用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); 

PROBLEM $.ajax现在是未定义的。 我怀疑,因为现在它返回绑定到一个特定的元素,但不完全确定的jQuery对象。 有谁知道为什么以及如何解决这个问题?

编辑我不是这样的一个哥们指出,如果我们把window附加到全球,我们可以得到简单的jquery对象,而不是工厂

  global.window = require('jsdom').jsdom().parentWindow; var $ = require('jquery'); // this works as $.ajax is now defined 

我不喜欢将窗口附加到全局,因为它会影响一些types检查窗口的插件。 不是一个封锁,但我很想看看是否有任何其他方式来解决这个问题。

我可以发誓,阅读jQuery的源代码,我试过这个问题的那一天,但它没有奏效。 我刚刚再次尝试,它正在工作。

tl; dr jQuery将$附加到浏览器模拟器的窗口名称空间。

 var document = require('jsdom').jsdom(), window = document.parentWindow; require('jquery')(window); var $ = window.$; 

希望对别人有用。

虽然存根很好,但它们不如不如莫克斯好的假货。 我会build议使用Sinon更有趣的function来创buildFakes。

可以伪造XMLHttpRequest和/或XMLHttpResponse

 var xhr, requests; before(function () { xhr = sinon.useFakeXMLHttpRequest(); requests = []; xhr.onCreate = function (req) { requests.push(req); }; }); after(function () { // Like before we must clean up when tampering with globals. xhr.restore(); }); it("makes a GET request for todo items", function () { getTodos(42, sinon.spy()); assert.equals(requests.length, 1); assert.match(requests[0].url, "/todo/42/items"); }); 

或者你甚至可以嘲笑一台服务器

 var server; before(function () { server = sinon.fakeServer.create(); }); after(function () { server.restore(); }); it("calls callback with deserialized data", function () { var callback = sinon.spy(); getTodos(42, callback); // This is part of the FakeXMLHttpRequest API server.requests[0].respond( 200, { "Content-Type": "application/json" }, JSON.stringify([{ id: 1, text: "Provide examples", done: true }]) ); assert(callback.calledOnce); }); 

你可以得到很有创意,嘲笑超时,延迟, 404的401的 。 由于您仍将使用JQuery.Ajax对象库,因此在注入可增强请求和响应的间谍时,您可以用比存储所有可能性更less的努力来创build更真实,更健壮的testing。

你有几个select在节点上做请求:

1)与jQuery

 var $ = require('jquery')(require("jsdom").jsdom().parentWindow); // now $.ajax works well 

2)用npm请求https://www.npmjs.com/package/request

3)使用本地对象XHR

我testing这三个选项,最后我使用包请求(以避免额外的包如jquery + jsdom)和奇怪的情况下原生XHR。