Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.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
Reactjs 未处理的PromisejectionWarning:_Reactjs_Jestjs - Fatal编程技术网

Reactjs 未处理的PromisejectionWarning:

Reactjs 未处理的PromisejectionWarning:,reactjs,jestjs,Reactjs,Jestjs,我正在尝试测试ReactJs组件,其中一个组件有一个方法可以获取数据,这个方法有一个承诺。。所以我尝试创建一个模拟文件: const apiFetch = { value() { return 42 }, } module.exports = apiFetch 然后: const spy = jest.spyOn(apiFetch, 'value') const isValue = apiFetch.value() expect(spy

我正在尝试测试ReactJs组件,其中一个组件有一个方法可以获取数据,这个方法有一个承诺。。所以我尝试创建一个模拟文件:

  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 })
未处理的PromisejectionWarning:未处理的承诺拒绝。这 错误源于异步函数的内部抛出 没有拦截,或拒绝未处理的承诺 with.catch()。(拒绝id:188)


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

通过开玩笑,你可以做如下事情:

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)的异步特性,那么即使异步承诺失败,测试也会通过

编辑

每个框架都有承诺支持。开玩笑的话有点像

it('works with resolves', () => {
   expect.assertions(1);
   return expect(apiFetch.value()).resolves.toEqual(42);
});
使用纯回调时,请使用注入的done


当使用承诺时,您可以使用注入的“done”函数,但是如果承诺失败并且没有调用“done”,那么测试将在超时时失败。对于jest,在测试承诺逻辑时,建议使用“it”、“expect”和“resolve”。

在运行异步测试时,应记住,在测试完成时需要指示测试方法

通过开玩笑,你可以做如下事情:

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)的异步特性,那么即使异步承诺失败,测试也会通过

编辑

每个框架都有承诺支持。开玩笑的话有点像

it('works with resolves', () => {
   expect.assertions(1);
   return expect(apiFetch.value()).resolves.toEqual(42);
});
使用纯回调时,请使用注入的done


当使用承诺时,您可以使用注入的“done”函数,但是如果承诺失败并且没有调用“done”,那么测试将在超时时失败。对于jest,建议在测试承诺逻辑时使用“it”、“expect”和“resolve”。

问题不包含。被拒绝的承诺在哪里?问题不包括。被拒绝的承诺在哪里?所有现代测试框架都支持承诺。如果测试失败,您提供的代码将导致测试超时和未处理的拒绝警告。不要在承诺中使用
done
,这是错误的。@estus谢谢你的评论。你说得对。我编辑了answerAll现代测试框架支持承诺。如果测试失败,您提供的代码将导致测试超时和未处理的拒绝警告。不要在承诺中使用
done
,这是错误的。@estus谢谢你的评论。你说得对。我已经编辑了答案