【问题标题】:Jest - UnhandledPromiseRejection - Received promise resolved instead of rejectedJest - UnhandledPromiseRejection - 收到的承诺已解决而不是被拒绝
【发布时间】:2022-03-10 00:03:23
【问题描述】:

Jest 向我抛出以下错误消息 --

node:internal/process/promises:245
          triggerUncaughtException(err, true /* fromPromise */);
          ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an
async function without a catch block, or by rejecting a promise which was not handled with .catch().
The promise rejected with the reason "Error: expect(received).rejects.toThrowError()

Received promise resolved instead of rejected
Resolved to value: undefined".] {
  code: 'ERR_UNHANDLED_REJECTION'
}
error Command failed with exit code 1.

我很不确定如何继续前进。来自 Jest 的错误消息读起来像是失败了,因为 promise 解决了并且它期望抛出一个错误......但是当抛出一个错误并说它未处理时感到不安?我一定完全理解错了。

这是我的测试--

    describe('credentials test', () => {
        it('without credentials', async () => {
            const provider = new Provider();
            provider.configure(testConfig);
            const spyon = jest.spyOn(Credentials, 'get').mockImplementation(() => {
                return Promise.reject('err');
            });

            const action = async () => {
                await provider.create({
                    param: val,
                });
            };

            expect(action()).rejects.toThrowError();
            spyon.mockRestore();
        });
    });

以及正在测试的代码 --

    public async create(
        params: CreateInput
    ): Promise<CreateOutput> {
        const cmd = new Command(params);
        const client = this._init();

        try {
            const credentialsOK = await this._ensureCredentials();
            if (!credentialsOK) {
                logger.error(NO_CREDS_ERROR_STRING);
                throw Error;
            }

            const output = await client.send(cmd);
            return output;
        } catch (error) {
            logger.error(`error - ${error}`);
        }
    }

    private async _ensureCredentials() {
        return await Credentials.get()
            .then(credentials => {
                if (!credentials) return false;
                const cred = Credentials.shear(credentials);
                logger.debug('set credentials', cred);
                this._config.credentials = cred;

                return true;
            })
            .catch(error => {
                logger.warn('ensure credentials error', error);
                return false;
            });
    }

【问题讨论】:

  • 你还需要awaitexpect(action()).rejects.toThrowError();
  • @Bergi 修复了它的一部分。现在我收到此错误 - expect(received).rejects.toEqual() -- Received promise resolved instead of rejected -- Resolved to value: undefined
  • 错误在 async create 函数中被捕获,这意味着返回的承诺已解决。在 catch 块中重新抛出异常以返回被拒绝的承诺。
  • @NomCereal 好吧,那么测试按预期工作,并暴露了代码中的错误:-)

标签: javascript typescript promise jestjs


【解决方案1】:

我写这个答案是为了帮助其他人解决这个问题,但来源是上面@bergi 的评论。您需要将awaitexpect(action()).rejects.toThrowError() 一起使用。这看起来像:

  it(`Should throw an error when bad things happen`, async () => {
    const result = doThing()
    await expect(result).rejects.toThrowError(`oh no`);
  });

关于 OP 的后续问题:

expect(received).rejects.toEqual() -- 收到的 promise 被解决而不是被拒绝 -- 被解析为值:未定义

这是一个单独的问题 - 正如 Jest 所说,您期望抛出的函数是返回 undefined 而不是抛出错误。您应该在您调用的代码中添加类似throw new Error('oh no') 的内容(尽管这又是一个单独的问题)。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2021-08-17
    • 2023-03-26
    • 2015-09-27
    • 2014-05-27
    • 2015-09-04
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多