Jest和Node.js:从函数获取授权令牌

时间:2020-07-27 17:13:27

标签: node.js jestjs supertest

我正在为我的Node Js Express应用程序使用Jest编写测试用例。对于我的应用程序,我必须使用不同的角色(3个角色-Admin,Supervisor和Emp)来测试每个功能的执行情况。因此,我计划编写三个函数,这些函数在身份验证后返回令牌,例如getAdminToken,getSupervisorToken和getEmpToken。但是,当我尝试从函数调用中获取令牌时,我的测试用例总是失败。但是当我在测试功能中使用相同的方法时有效。

以下是我编写的方法,我希望为管理员角色返回一个有效的令牌,但这不起作用

async function getAdminToken() {
    console.log("getAdminToken: Start");
    loginToken = "";
    const response = await 
                        myApp.
                        post('/account/login/').
                        send({
                            "email":AdminTestAccount.GetInstance().Email,
                            "password":AdminTestAccount.GetInstance().Password
                        });

    loginToken = response.body.Data.token;

    console.log("getAdminToken: End");
    return loginToken;
}

以下是 It 函数

it("test supervisor creation by admin", async (done) => {

        //login as Admin role
        if (loginToken == "") {
            console.log("Before getting token");
            loginToken = await getAdminToken();
            console.log("After getting token: " + loginToken);
        }

        response = await 
                            myApp.                            
                            post('/supervisor').
                            send({
                                "name":supervisor[0]
                            }).
                            set('Authorization', AdminTestAccount.GetBearerToken(loginToken));

        expect(response.status).toBe(200);
        expect(response.body.IsSuccessful).toBe(true);//**<--Test fails here**
        expect(response.body.SuccessMessage).toBe("Supervisor created.");
        expect(response.body.ReasonForFailure).toBe("");
        expect(response.body.AdditionalInfo).toBe("");
        expect(response.body.Data).toBe(supervisor[0]);
        
        done();        
    });

但是上面的代码不起作用。相反,如果我将令牌功能作为 It 测试功能的一部分,则所有功能都可以正常工作。以下是有效的代码。

it("test team creation by admin", async (done) => {

        var response = await 
                            myApp.
                            post('/account/login/').
                            send({
                                "email":AdminTestAccount.GetInstance().Email,
                                "password":AdminTestAccount.GetInstance().Password
                            });

        expect(response.status).toBe(200);
        expect(response.body.IsSuccessful).toBe(true);
        expect(response.body.Data._id).not.toBe("");
        expect(response.body.Data.email).toBe(AdminTestAccount.GetInstance().Email);
        expect(response.body.Data.roleId).toBe(AdminTestAccount.GetInstance().RoleId.toString());
        expect(response.body.Data.token).not.toBeUndefined();
        expect(response.body.Data.token).not.toBeNull();
        expect(response.body.Data.token).not.toBe("");

        loginToken = response.body.Data.token;

        response = await 
                            myApp.                            
                            post('/team').
                            send({
                                "name":supervisor[0]
                            }).
                            set('Authorization', AdminTestAccount.GetBearerToken(loginToken));

        expect(response.status).toBe(200);
        expect(response.body.IsSuccessful).toBe(true);
        expect(response.body.SuccessMessage).toBe("supervisor created.");
        expect(response.body.ReasonForFailure).toBe("");
        expect(response.body.AdditionalInfo).toBe("");
        expect(response.body.Data).toBe(supervisor[0]);
        
        done();        
    });

您能协助我通过函数调用返回Token的代码中缺少的内容吗?

谢谢, 赫曼特。

1 个答案:

答案 0 :(得分:0)

由于 supertest 期望 cookie 位于数组中,因此您必须返回数组中的 cookie。

 return [loginToken]
相关问题