javascript - Jest mockRejectedValue 在节点中抛出未处理的承诺拒绝
问题描述
我试图开玩笑地写一个测试,但是当我尝试使用时不断收到 UnhandledPromiseRejectionWarningmockRejectedValue
代码如下所示:
it('Should set error message when call fails', async () => {
const context = mockActionsContext();
const user = {
username: 'alice',
password: 'password'
};
const getError = new Error('network error');
(AuthService.login as jest.Mock) = jest.fn().mockRejectedValue(getError);
await actions[ActionTypes.USER_LOGIN](context, user);
// Check is the commits are called
expect((context.commit as any).mock.calls).toEqual([
[MutationTypes.USER_LOGIN],
[MutationTypes.USER_LOGIN_ERROR, 'Oops, something went wrong. Try again later!']
]);
// Login service is called with user login
expect(AuthService.login as jest.Mock).toHaveBeenCalledWith(user);
});
AuthService.login
返回一个 axios.post 我尝试用模拟覆盖它
。actions[ActionTypes.USER_LOGIN](context, user)
调用 Authservice.login
测试通过了,但我不希望任何未处理的承诺拒绝。有人知道如何解决吗?
编辑@goodmorningasif 感谢您的回复。我一直在看它太久了,我的事情:)
动作如下所示:
[ActionTypes.USER_LOGIN]: ({ commit }: Context, payload: User) => {
return new Promise((resolve, reject) => {
commit(MutationTypes.USER_LOGIN);
AuthService.login(payload)
.then((token) => {
commit(MutationTypes.USER_LOGIN_SUCCESS, token);
localStorage.setItem('user-token', token);
client.defaults.headers.common.Authorization = `Bearer ${token}`;
resolve(token);
})
.catch((error) => {
let errorMessage = 'Oops, something went wrong. Try again later!';
if (error?.response?.status === 401) {
errorMessage = 'Unknown username and password combination!';
}
localStorage.removeItem('user-token');
commit(MutationTypes.USER_LOGIN_ERROR, errorMessage);
reject(error);
});
});
},
解决方案
在我的情况下,动作是返回一个承诺,女巫会被拒绝。在测试中,我直接调用动作而不是被拒绝。
await actions[ActionTypes.USER_LOGIN](context, user).catch(() => null);
这解决了它。
解决方案
我们能看到 action 和 reducer 代码吗?您的错误可能有错误:)
您正在测试登录函数是否被调用,并且该操作会返回您设置的错误消息,但您正在假设导致错误的原因。也许不是因为mockRejectedValue
/'network error'。
我建议在操作有效负载中包含实际的错误消息以及您的错误消息:一个用于开发人员和调试,另一个用于让用户知道下一步该做什么。
我还发现这有助于理解UnhandledPromiseRejectionWarning
:https ://thecodebarbarian.com/unhandled-promise-rejections-in-node.js.html
顺便说一句,找出问题的好本能,而不是满足于通过测试!
推荐阅读
- kubernetes - 如何阻止通量部署到我的默认命名空间?
- c# - 正则表达式 c# cSharp - 仅检查字符串 字母和一个空格“”和一个“-”
- python - 使用 Selenium AttributeError 将 href 链接附加到列表中:“str”对象没有属性“get_attribute”
- python - 不确定“和”操作
- discord - 如何在 discord.net 中按 ID 获取和编辑消息?
- python - 如何使用切片获取特定行/列的数据?
- css - 如何使动画图像响应?
- android - 使用 AnnotatedString 在文本之间添加小填充/边距
- c# - 调用 Process 而不是等待它完成
- swift - Swift Collection View 将单元格对齐到位不允许我返回到第一个单元格