我使用Jasmine 2.0并尝试在ajax调用后测试回调的结果。我尝试了一些我在网上找到的东西,但没有找到解决我问题的方法。我是Jasmine和JQuery的新手,在这个问题上度过了非常艰难的时期。任何建议将不胜感激。
以下是正在测试的示例代码:
//common.js
function getSomeServiceResponse(method, param, callback) {
$.ajax({
dataType: "json",
url: "https://some.thing.com/api/mobile/" + method,
data: param
})
.done(function (data) {
var response = $.parseJSON(data);
//some stuff
if ($.isFunction(callback)) {
callback(response);
}
})
.fail(function (jqXHR, textStatus) {
//some error handling stuff
if ($.isFunction(callback)) {
callback({
ResultNumber: -1,
});
}
});
}
//main.js
var someGlobalObj = {
//some stuff for global obj
//some funcs
querySession: function (callback) {
//Some validation stuff
getSomeServiceResponse(
"querysomesession", {
//some params
},
function (data) {
someGlobalObj.sessionData = data.Session;
someGlobalObj.info = data.Info;
if ($.isFunction(callback)) {
callback(data);
}
}
);
}
}
测试(随意对测试设置/布局发表评论,因为我是新手,可能不正确):
describe("querySession()", function () {
describe("with existing session found", function () {
var response;
beforeEach(function () {
spyOn($, 'ajax').and.callFake(function (req) {
var d = $.Deferred();
var data = {
"Info": [],
"Session": {
"ID": 999,
"DateCreate": "\/Date(1398966244520)\/",
//Some other stuff
},
"ResultNumber": 0,
};
d.resolve(data);
return d.promise();
});
someGlobalObj.sessionId = 1;
someGlobalObj.querySession(function (data) {
response = data;
});
});
it("should set someGlobalObj.sessionData with an ID of 999", function () {
//expect(someGlobalObj.sessionData.ID).toBe(999);
expect(response.Session.ID).toBe(999);
});
简而言之,调用someGlobalObj.querySession并传递回调。在querySession中,调用getSomeServiceResponse并传递一个回调(调用原始回调)。在回调触发后,我希望传递的数据填充我的响应是someGlobalObj中设置的。这不是我的代码,但如果有的话,我也许可以回答一些问题。抱歉有任何困惑。
修改 我现在正在进入假冒,因为我已经添加了一些控制台日志记录。测试失败并出现错误:"语法错误:意外的令牌o"。如果我只是做d.resolve('假的'),我会得到"意想不到的令牌k"代替。不确定此错误的来源。
答案 0 :(得分:0)
我发现了意外令牌语法错误的问题。
罪魁祸首是:
var data = {
"Info": [],
"Session": {
"ID": 999,
"DateCreate": "\/Date(1398966244520)\/",
//Some other stuff
},
"ResultNumber": 0,
};
在getSomeServiceResponse.done中:
var response = $.parseJSON(data);
我将数据更改为JSON以解决问题。最初的问题是有一些验证我没有注意到甚至无法调用getSomeServiceResponse,所以间谍从未使用过。这在我的问题中是模糊的,因为我删除了验证码。
很抱歉浪费时间......再次编码迟到了。