如何对调用getJSON的javascript函数进行单元测试[英] How to unit test javascript function that calls getJSON

问题描述

我一直在使用单位测试挣扎了2天,在异步测试方面我无法实现一些目标.我是对单元测试的新手,我不明白为什么这不起作用.

我有一个文件登录.JS,该文件调用$ .getJson(url,数据,函数),并返回具有登录状态("成功"或"失败")的字符串. $ .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);
});

在测试结果中我得到:

期望:"成功"

结果:未定义

推荐答案

您的login函数应该是异步的,因为它的结果取决于服务器的响应.

所以让我们重写这样的功能:

function login(user, pass, done) {
    $.getJSON(..., function (res) {
        done(res.status == 'success')
    })
}

然后您可以这样测试(假设摩卡):

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(qunit)

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);
});

本文地址:https://www.itbaoku.cn/post/1740089.html