首页 > 解决方案 > 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);

这解决了它。

标签: javascripttypescriptjestjs

解决方案


我们能看到 action 和 reducer 代码吗?您的错误可能有错误:)

您正在测试登录函数是否被调用,并且该操作会返回您设置的错误消息,但您正在假设导致错误的原因。也许不是因为mockRejectedValue/'network error'。

我建议在操作有效负载中包含实际的错误消息以及您的错误消息:一个用于开发人员和调试,另一个用于让用户知道下一步该做什么。

我还发现这有助于理解UnhandledPromiseRejectionWarninghttps ://thecodebarbarian.com/unhandled-promise-rejections-in-node.js.html

顺便说一句,找出问题的好本能,而不是满足于通过测试!


推荐阅读