Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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 mockRejectedValue在节点中抛出未处理的承诺拒绝_Javascript_Typescript_Jestjs - Fatal编程技术网

Javascript Jest mockRejectedValue在节点中抛出未处理的承诺拒绝

Javascript Jest mockRejectedValue在节点中抛出未处理的承诺拒绝,javascript,typescript,jestjs,Javascript,Typescript,Jestjs,我试图开玩笑地编写一个测试,但当我尝试使用mockRejectedValue 代码如下所示: it('Should set error message when call fails', async () => { const context = mockActionsContext(); const user = { username: 'alice', password: 'password'

我试图开玩笑地编写一个测试,但当我尝试使用
mockRejectedValue

代码如下所示:

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\u LOGIN](上下文,用户)
调用Authservice.LOGIN

考试通过了,但我不希望任何未经处理的承诺被拒绝。有人知道怎么修吗


编辑 @早上好,谢谢你的回复。 我看了太久了,我想:)

行动如下:

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

这就解决了问题。

我们能看到操作和代码吗?您的错误中可能有错误:)

您正在测试登录函数是否被调用,操作是否返回您设置的错误消息,但您正在假设是什么导致了错误。也许这不是因为
mockRejectedValue
/“网络错误”

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

我还发现这有助于理解
未处理的PromisejectionWarning


顺便说一句,你有很好的直觉去解决问题,不满足于考试的通过

谢谢你的回答。我添加了动作。事实上,你的回答和文档对我帮助很大。阅读后,我将代码更改为
wait actions[ActionTypes.USER\u LOGIN](context,USER.catch)(()=>null)承诺错误现在进入catch。啊,这是有道理的。您的mockRejectedValue仅模拟AuthService.login,而不模拟链接到它的.catch()。很高兴我能帮上一点忙:)你应该包括答案,以防其他人也有同样的问题