Sinon FakeServer 没有请求?
Sinon FakeServer no requests?
我正在关注 SinonJS Fake Server tutorial 并且我是 运行 这个简单的代码:
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。事实证明,试图执行 urlObj = new URL(uri, documentBaseURLSerialized(this._ownerDocument));
的 jsdom 节点模块出现语法错误,然后导致 $.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);
});
我正在关注 SinonJS Fake Server tutorial 并且我是 运行 这个简单的代码:
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。事实证明,试图执行 urlObj = new URL(uri, documentBaseURLSerialized(this._ownerDocument));
的 jsdom 节点模块出现语法错误,然后导致 $.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);
});