未处理的Promise拒绝警告:

IT技术 reactjs jestjs
2021-05-11 08:04:10

我正在尝试测试 ReactJs 组件,其中一个组件有一个方法来获取数据,获取中有一个Promise......所以我尝试创建一个模拟文件:

  const apiFetch = {
      value() {
        return 42
      },
    }

module.exports = apiFetch

然后:

const spy = jest.spyOn(apiFetch, 'value')

const isValue = apiFetch.value()

expect(spy).toHaveBeenCalled()

expect(isValue).toBe(42)

测试正在通过,但此警告仍在显示。

我补充了一件事:

process.on('UnhandledPromiseRejectionWarning', (e) => { throw e })

UnhandledPromiseRejectionWarning:未处理的Promise拒绝。这个错误要么是因为在没有 catch 块的情况下抛出了异步函数,要么是因为拒绝了一个没有用 .catch() 处理过的Promise。(拒绝编号:188)

1个回答

在运行异步测试时,您应该记住,您需要在测试方法完成时指明它。

开玩笑,您可以执行以下操作:

apiFetch.js

const apiFetch = {
    value() {
        return Promise.resolve(42);
    },
}

module.exports = apiFetch

apiFetch.test.js:

const apiFetch = require('./apiFetch');

test('the data is peanut butter', done => {
    apiFetch.value().then(data => {
        expect(data).toBe(42);
        done();
    })
});

done 是一个注入的函数参数(由 jest 框架提供),在调用时表示测试方法的结束。

如果您在不使用 jest(或 mocha)的异步功能的情况下测试异步逻辑,那么即使异步Promise失败,测试也会通过

编辑

每个框架都有Promise支持。开玩笑,它就像

it('works with resolves', () => {
   expect.assertions(1);
   return expect(apiFetch.value()).resolves.toEqual(42);
});

使用纯回调时,请使用注入的 done。

使用 promise 时,您可以使用注入的“done”函数,但如果 promise 失败且未调用“done”,则测试将在超时时失败。对于 jest,建议在测试 promise 逻辑时使用 'it' 、 'expect' 和 'resolve' 。