UnhandledPromiseRejection警告:

Alb*_*oti 1 reactjs jestjs

我正在尝试测试ReactJs组件,其中的一个组件具有一种获取数据的方法,而其中的获取具有应有的承诺。因此,我尝试创建一个模拟文件:

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

module.exports = apiFetch
Run Code Online (Sandbox Code Playgroud)

然后:

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

const isValue = apiFetch.value()

expect(spy).toHaveBeenCalled()

expect(isValue).toBe(42)
Run Code Online (Sandbox Code Playgroud)

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

我又添加了一件事:

process.on('UnhandledPromiseRejectionWarning', (e) => { throw e })
Run Code Online (Sandbox Code Playgroud)

UnhandledPromiseRejectionWarning:未处理的承诺拒绝。该错误是由于在没有catch块的情况下抛出异步函数而引起的,或者是由于拒绝了未经.catch()处理的诺言而引起的。(拒绝ID:188)

Mar*_*oza 5

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

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

apiFetch.js

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

module.exports = apiFetch
Run Code Online (Sandbox Code Playgroud)

apiFetch.test.js:

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

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

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

如果您在不使用Jest(或Mocha)的异步功能的情况下测试异步逻辑,那么即使异步承诺失败,测试也将通过

编辑

每个框架都有承诺支持。开玩笑的是这样的

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

使用纯回调时,请使用已完成的操作。

使用promise时,可以使用注入的“ done”功能,但是如果promise失败并且未调用“ done”,则测试将在超时时失败。最好在测试promise逻辑时建议使用“ it”,“ expect”和“ resolve”。

  • 所有现代测试框架均支持承诺。您提供的代码将导致测试超时*,并且在测试失败的情况下会产生*未处理的拒绝警告。不要在承诺中使用`done`,这是错误的。 (3认同)