如何对调用getJSON的javascript函数进行单元测试

如何对调用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测试 问题似乎在于测试

我已经为单元测试苦苦挣扎了两天了,关于异步测试,有一些东西我做不到。我是单元测试新手,我不明白为什么这不起作用

我有一个文件login.js,它调用$.getJSON(url、数据、函数),并返回一个状态为login的字符串(“成功”或“失败”)。 对$.getJSON的调用使用mockjax获取数据(它包装了一个ajax调用)

当使用jqueryclick事件从测试网页调用时,login函数工作正常。 但现在我正在尝试使用Qunit和PhantomJS运行headless测试

问题似乎在于测试没有等待$.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";
       } 
    });
};
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上测试:/