Sinon FakeServer没有请求?

我正在关注SinonJS 假服务器教程 ,我正在运行这个简单的代码:

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); }); 

我将getTodos函数包含在同一个文件中。 这也是:

 function getTodos(listId, callback) { $.ajax({ url: "/todo/" + listId + "/items", success: function (data) { // Node-style CPS: callback(err, data) callback(null, data); } }); } 

但是,我收到一个错误TypeError: Cannot read property 'respond' of undefined 。 看起来server.requests是空的 – 这是为什么? 如何确保请求出现?

更新 :我能够缩小问题的范围。 我在getTodos函数中添加了一个“错误”回调,并为错误执行了console.log。 事实certificate,来自jsdom节点模块的语法错误试图做urlObj = new URL(uri, documentBaseURLSerialized(this._ownerDocument)); 然后导致$.ajax({失败。任何人对此有什么想法?

我能想到的一个问题是你没有在你的JSDom实例中加载Sinon。 这是一个在这里工作的测试文件:

 var jsdom = require("jsdom"); var assert = require("assert"); var vc = jsdom.createVirtualConsole(); vc.on("log", console.log.bind(console.log)); vc.on("jsdomError", function jsdomError(er) { throw er; }); var window; var $; var sinon; before(function (done) { jsdom.env({ html: "", scripts: ["node_modules/jquery/dist/jquery.js", "node_modules/sinon/pkg/sinon.js"], features: { ProcessExternalResources: ["script"], FetchExternalResources: ["script", "link"], }, virtualConsole: vc, done: function _done(error, w) { if (error) { throw error; } window = w; $ = w.$; sinon = w.sinon; done(); }, }); }); function getTodos(listId, callback) { $.ajax({ url: "/todo/" + listId + "/items", success: function (data) { // Node-style CPS: callback(err, data) callback(null, data); } }); } 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); }); 

只需使用:

 var { JSDOM } = require('jsdom') var dom = new JSDOM window = dom.window window.XMLHttpRequest = sinon.useFakeXMLHttpRequest()