如何对调用getJSON的javascript函数进行单元测试
我已经为单元测试苦苦挣扎了两天了,关于异步测试,有一些东西我做不到。我是单元测试新手,我不明白为什么这不起作用 我有一个文件login.js,它调用$.getJSON(url、数据、函数),并返回一个状态为login的字符串(“成功”或“失败”)。 对$.getJSON的调用使用mockjax获取数据(它包装了一个ajax调用) 当使用jqueryclick事件从测试网页调用时,login函数工作正常。 但现在我正在尝试使用Qunit和PhantomJS运行headless测试 问题似乎在于测试没有等待$.getJSON调用获得结果(即使使用超时)。 有什么线索吗? 这是代码 login.js如何对调用getJSON的javascript函数进行单元测试,javascript,unit-testing,phantomjs,getjson,qunit,Javascript,Unit Testing,Phantomjs,Getjson,Qunit,我已经为单元测试苦苦挣扎了两天了,关于异步测试,有一些东西我做不到。我是单元测试新手,我不明白为什么这不起作用 我有一个文件login.js,它调用$.getJSON(url、数据、函数),并返回一个状态为login的字符串(“成功”或“失败”)。 对$.getJSON的调用使用mockjax获取数据(它包装了一个ajax调用) 当使用jqueryclick事件从测试网页调用时,login函数工作正常。 但现在我正在尝试使用Qunit和PhantomJS运行headless测试 问题似乎在于测试
var login = function(user, pass){
$.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
if(response.status === "success"){
//do something
return "success";
}
else{
//do something else
return "fail";
}
});
};
var login = function(form, cb){
$.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
if(response.status === "success"){
//do something
}
else{
//do something else
}
cb(response.status);
});
};
test.js
test("Test login", function(){
var user = "user1", pass = "pass1";
var done = assert.async();
var result = login(user, pass);
setTimeout(function(){
assert.equal(result, "success", "expect login succeded");
done();
},1000);
});
在测试结果中,我得到:
预期:“成功”
结果:未定义的您的
登录
函数应该是异步的,因为其结果取决于服务器的响应
让我们重写函数,如下所示:
function login(user, pass, done) {
$.getJSON(..., function (res) {
done(res.status == 'success')
})
}
然后你可以这样测试(假设是摩卡咖啡):
在将我的登录函数重写为@ayanami后,代码运行平稳,如下所示:
function login(user, pass, done) {
$.getJSON(..., function (res) {
done(res.status == 'success')
})
}
login.js
var login = function(user, pass){
$.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
if(response.status === "success"){
//do something
return "success";
}
else{
//do something else
return "fail";
}
});
};
var login = function(form, cb){
$.getJSON("loginURL", {"user":user, "pass":pass}, function(response){
if(response.status === "success"){
//do something
}
else{
//do something else
}
cb(response.status);
});
};
test.js(qunit)
您的
登录
函数不会返回任何内容。因此,结果
总是未定义是正常的。在登录
函数中,您只需调用$.getJSON
,但不会返回任何结果。在成功回调中,您试图返回一些结果,但显然这没有多大作用,因为没有人在读取此结果。可能是Hi@ayanami的重复!谢谢你的快速回复。我不知道这个调用是如何工作的(res.status=='success'),然后在test.js上,isLoggedIn是什么?抱歉,但我不知道如何在qunit上测试:/