我正在使用 Jest 为 Node 项目添加测试覆盖率。我正在测试的代码在 promise 中抛出错误,导致 UnhandledPromiseRejectionWarning
消息被记录到控制台。
在编写测试时,我可以很容易地识别这些问题并解决它们,但这些警告实际上并没有导致 Jest 将测试标记为失败,因此我们的 CI 不会捕获它。我四处寻找任何建议,但没有找到太多。
我确实在 Node 的文档中发现您可以捕获这些警告并处理它们...
process.on('unhandledRejection', (error) => {
throw error; // Or whatever you like...
});
因此,将这段代码添加到我的测试用例中似乎非常简单。毕竟,在测试中抛出的 Error
应该导致测试失败...
describe('...', () => {
it('...', () => {
process.on('uncaughtRejection', (error) => {
throw error;
});
// the rest of my test goes here
});
});
不幸的是,我看到的行为是错误确实被抛出,但 Jest 没有捕捉到它并未能通过测试。相反,Jest 会因此错误而崩溃,并且测试不会继续运行。这并不是真正可取的,而且似乎是不正确的行为。
在 uncaughtRejection
处理程序之外抛出错误按预期工作:Jest 记录抛出的错误并失败测试,但不会崩溃。 (即测试观察者不断观察和运行测试)
最佳答案
我处理这个问题的方式与我编写函数的方式密切相关——基本上,任何使用 Promise 的函数都应该返回一个 Promise。这允许调用该函数的任何代码以它认为合适的任何方式处理捕获错误。请注意,这是我的方法,我不会声称这是做事的唯一方法。
例如...假设我正在测试这个功能:
const myFunction = () => {
return doSomethingWithAPromise()
.then(() => {
console.log('no problems!');
return true;
});
};
测试将如下所示:
describe('...', () => {
it('...', () => {
return myFunction()
.then((value) => {
expect(value).toBe(true);
});
});
});
效果很好。现在如果 promise 被拒绝会发生什么?在我的测试中,被拒绝的 promise 被传回给 Jest(因为我正在返回我的函数调用的结果)并且 Jest 可以报告它。
相反,如果你的函数没有返回一个 Promise,你可能需要做这样的事情:
const myOtherFunction = () => {
doSomethingWithAPromise()
.then(() => {
console.log('no problems!');
return true;
})
.catch((err) => {
// throw the caught error here
throw err;
});
};
与上面的示例不同,Jest 没有(直接)方法来处理被拒绝的 promise ,因为您没有将 promise 传回给 Jest。避免这种情况的一种方法可能是确保函数中有一个 catch
来捕获并抛出错误,但我没有尝试过,我不确定如果它会更可靠。
关于javascript - 当发生未捕获的 Promise 拒绝时,我如何在 Jest 中通过测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50121134/