如何对调用 getJSON 的 javascript 函数进行单元测试
How to unit test javascript function that calls getJSON
我已经为单元测试苦苦挣扎了 2 天,在异步测试方面有些事情我无法实现。我是单元测试的新手,我不明白为什么这不起作用。
我有一个文件 login.js 调用 $.getJSON(url, data, function) 和 returns 一个带有登录状态的字符串 ("success"或 "fail")。
对 $.getJSON 的调用使用 mockjax 来获取数据(它包装了一个 ajax 调用)。
当使用 jQuery 单击事件从测试网页调用时,登录功能工作正常。
但现在我正在尝试 运行 使用 Qunit 和 PhantomJS 进行无头测试。
看来问题是测试没有等待 $.getJSON 调用来获取结果(即使使用超时)。
有什么线索吗?
这是代码。
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";
}
});
};
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);
});
在测试结果中我得到:
预计:"success"
结果:未定义
您的 login
函数应该是异步的,因为它的结果取决于服务器的响应。
所以让我们像这样重写函数:
function login(user, pass, done) {
$.getJSON(..., function (res) {
done(res.status == 'success')
})
}
然后你可以这样测试(假设是mocha):
describe('...', function () {
it('login()', function (done) {
login('user', 'pw', function (isLoggedIn) {
assert(isLoggedIn)
done()
})
})
})
按照@ayanami 的建议重写我的登录函数后,代码运行顺利,看起来像这样:
login.js
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( "Testing login", function( assert ) {
var done = assert.async();
var cb = function(param){
assert.equal(param,"success", "Expect getJSON/login to success");
done();
};
login(user, pass,cb);
});
我已经为单元测试苦苦挣扎了 2 天,在异步测试方面有些事情我无法实现。我是单元测试的新手,我不明白为什么这不起作用。
我有一个文件 login.js 调用 $.getJSON(url, data, function) 和 returns 一个带有登录状态的字符串 ("success"或 "fail")。 对 $.getJSON 的调用使用 mockjax 来获取数据(它包装了一个 ajax 调用)。
当使用 jQuery 单击事件从测试网页调用时,登录功能工作正常。 但现在我正在尝试 运行 使用 Qunit 和 PhantomJS 进行无头测试。
看来问题是测试没有等待 $.getJSON 调用来获取结果(即使使用超时)。 有什么线索吗? 这是代码。
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";
}
});
};
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);
});
在测试结果中我得到:
预计:"success"
结果:未定义
您的 login
函数应该是异步的,因为它的结果取决于服务器的响应。
所以让我们像这样重写函数:
function login(user, pass, done) {
$.getJSON(..., function (res) {
done(res.status == 'success')
})
}
然后你可以这样测试(假设是mocha):
describe('...', function () {
it('login()', function (done) {
login('user', 'pw', function (isLoggedIn) {
assert(isLoggedIn)
done()
})
})
})
按照@ayanami 的建议重写我的登录函数后,代码运行顺利,看起来像这样:
login.js
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( "Testing login", function( assert ) {
var done = assert.async();
var cb = function(param){
assert.equal(param,"success", "Expect getJSON/login to success");
done();
};
login(user, pass,cb);
});