所以我想测试一个名为' getTheValues'的方法,它进行Ajax调用。我用值嘲笑了服务器响应,但是当我运行测试时,我得到了两次失败,但没有解释他们失败的原因。我在这里做错了什么?
test("Test - call Ajax within method.", function () {
var callback = sandbox.spy();
server.respondWith("GET", "/ajaxtest/getmethod",
[200, { "Content-Type": "application/json" },
'[{ "id": 123, "name": "John" }]']);
getTheValues();
server.respond();
ok(callback.calledOnce, "Callback was called once");
ok(callback.calledWith([{ id: 123, name: "John" }]), "Callback with correct values.");
});
function getTheValues(callback) {
// do some stuff including an ajax call:
$.ajax({
type: 'GET',
dataType: 'json',
cache: false,
url: '/ajaxtest/getmethod',
success: function(data) {
} });
}
答案 0 :(得分:0)
首先是(工作)代码:
QUnit.module('Test Module', {
before: function () {
this.server = sinon.fakeServer.create();
},
after: function () {
this.server.restore();
delete this.server;
}
});
QUnit.test("Test - call Ajax within method.", function (assert) {
var callback = sinon.spy(jQuery, "ajax");
this.server.respondWith("GET", "/ajaxtest/getmethod", /*?id=123&name=-John*/
[200, { "Content-Type": "application/json" },
'[{ "id": 123, "name": "John" }]']);
var a = getTheValues();
this.server.respond();
assert.ok(callback.calledOnce, "Callback was called once");
var callArgs = callback.args[0][0];
assert.equal(JSON.stringify(callArgs.data), JSON.stringify({ "id": 123, "name": "John" }));
});
function getTheValues() {
// do some stuff including an ajax call:
$.ajax({
data: { id: 123, name: "John" },
method: 'GET',
dataType: 'json',
cache: false,
url: '/ajaxtest/getmethod',
success: function (data) {
}
});
下一个解释
这对我来说这不是纯粹的QUnit测试。我假设你也在使用SinonJS。
关于间谍方法你需要指出什么是间谍
sinon.spy(jQuery,“ajax”)
你不能使用callback.calledWith这样返回true / false并且比较对象({} === {})将(几乎)总是返回false。所以这个测试会不断失败。相反,你需要间谍参数(在你的情况下是callback.args [0] [0];)并将特定部分与期望的结果进行比较。有关这方面的更多信息,您可以find here 实际上你不需要提取那些,但我这样做是为了使代码(希望)更清晰。
所以
最后你的模拟对象缺少数据对象,将与GET请求一起发送。
HTH