Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用jest测试登录api_Javascript_Unit Testing_Jestjs - Fatal编程技术网

Javascript 用jest测试登录api

Javascript 用jest测试登录api,javascript,unit-testing,jestjs,Javascript,Unit Testing,Jestjs,如何测试此Api并获得100%的测试覆盖率分数 const login = async (email, password) => { axios .post('https://conduit.productionready.io/api/users/login', { user: { email, password, }, }) .then((response) => response); }; 您

如何测试此Api并获得100%的测试覆盖率分数

const login = async (email, password) => {
  axios
    .post('https://conduit.productionready.io/api/users/login', {
      user: {
        email,
        password,
      },
    })
    .then((response) => response);
};

您的函数相对简单:一条路径,没有分支逻辑,一个外部调用

您的所有函数都是通过
axios.post
调用端点

login.js

export const login=async(电子邮件、密码)=>{
/*
*请注意,我添加了'wait',否则'async'就没用了。
*否则可以直接返回axios.post方法。
*/
等待axios
.post('https://conduit.productionready.io/api/users/login', {
用户:{
电子邮件,
密码,
},
})
.然后((response)=>response);//这行暂时也没用
};
login.spec.js

从“/login”导入{login};
//Mock axios,否则您将真正请求端点
开玩笑的模仿(‘axios’);
从“axios”导入axios;
描述('登录测试',()=>{
描述('登录功能',()=>{
常数电子邮件test@test.com';
const password='password';
在每个之前(()=>{
/*
*暂时不需要,但会很有用
*测试成功和错误响应的步骤
*/
axios.post.mockResolvedValue({});
});
它('应该使用给定的电子邮件和密码调用端点',异步()=>{
等待登录(电子邮件、密码);
期望(axios.post).使用(
'https://conduit.productionready.io/api/users/login',
{用户:{电子邮件,密码}},
);
});
});
});
请注意,通过返回一些内容并处理带有身份验证错误的错误,您可以极大地改进登录功能。您的测试将更有意义:

errors.js

导出类DefaultError扩展错误{
静态状态\u CODE=500;//您可以更改它,这取决于您如何使用它
名称='DefaultError';
构造函数(){
超级(“默认错误,添加所需内容”);
}
}
导出类AuthenticationError扩展错误{
静态状态_代码=401;
名称='AuthenticationError';
构造函数(){
超级(“错误凭证”);
}
}
login.js

从“/errors”导入{AuthenticationError,DefaultError};
导出常量登录=异步(电子邮件、密码)=>
axios
.post('https://conduit.productionready.io/api/users/login', {
用户:{
电子邮件,
密码,
},
})
.then(response=>response.data)
.catch(错误=>{
//以您希望的方式处理错误
if(error.status==AuthenticationError.status\u代码){
抛出新的AuthenticationError();
}
抛出新的DefaultError();
});
login.spec.js

从“/login”导入{login};
从“/errors”导入{AuthenticationError,DefaultError};
//Mock axios,否则您将真正请求端点
开玩笑的模仿(‘axios’);
从“axios”导入axios;
描述('登录测试',()=>{
描述('登录功能',()=>{
常数电子邮件test@test.com';
const password='password';
描述('成功',()=>{
const data={something:{}};
在每个之前(()=>{
axios.post.mockResolvedValue({data});
});
它('应该使用给定的电子邮件和密码调用端点',异步()=>{
等待登录(电子邮件、密码);
期望(axios.post).使用(
'https://conduit.productionready.io/api/users/login',
{用户:{电子邮件,密码}},
);
});
它('应该返回响应数据',异步()=>{
const response=等待登录(电子邮件、密码);
expect(响应)。toStrictEqual(数据);
});
});
描述('有错误',()=>{
描述('状态401',()=>{
在每个之前(()=>{
axios.post.mockRejectedValue({status:401});
});
它('应该抛出AuthenticationError',async()=>{
等待期望(登录(电子邮件、密码)).rejects.toThrow(AuthenticationError);
});
});
描述('其他状态',()=>{
在每个之前(()=>{
axios.post.mockRejectedValue({});
});
它('应该抛出DefaultError',async()=>{
等待期望(登录(电子邮件,密码)).rejects.toThrow(默认错误);
});
});
});
});
});

我们可以走得更远,但我想你说得对。顺便说一句,你不需要像我那样拆分测试,我只是喜欢能够按照所需的模拟对测试进行分组,并进行一些可读性测试。

你当前的测试和覆盖范围是什么?它只有一条路径,没有分支逻辑,所以获得完全覆盖应该不是问题。该函数有一些明显的问题,尽管-它是
async
,但不
等待
任何东西,使用
。然后
(毫无意义,
。然后((值)=>value)
是一个no-op),尽管是
async
,并且不返回任何东西。