如何确保Jest在“ unhandledRejection”上失败?

Vin*_*rga 5 javascript promise jestjs

我们的单元测试在我们的连续交付管道中的容器中运行。

有时,我们不会在单元测试中处理拒绝,但是,我认为这是不正确的,并且我认为管道会失败。

如何确保在执行jest和测试期间unhandledRejection发生事件,玩笑会退出并出错?

我试图将事件监听器挂在安装脚本中:

/* jest.config.js */
module.exports = {
    setupFiles: ['<rootDir>/test/setup.ts'],
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在该设置脚本中,我可以检测到unhandledRejection事件,但是不幸的是,我无法开玩笑

process.on('unhandledRejection', () => {
    console.error('Now what?');
    console.error('I want to make sure that jest exits with an error!');
});
Run Code Online (Sandbox Code Playgroud)

And*_*erg 12

您可以创建一个 jest 配置文件jest.config.js并将以下条目放入其中:

module.exports = {
  ...
  setupFiles: ['<rootDir>/test/setup.js'],
  ...
};
Run Code Online (Sandbox Code Playgroud)

然后在您的setup.js文件中,您可以执行以下操作:

process.on('unhandledRejection', (err) => {
  fail(err);
});
Run Code Online (Sandbox Code Playgroud)

并且unhandledRejection会在测试中失败,尽管有两个警告需要注意:

  1. 在没有测试运行时拒绝的承诺的未处理拒绝将结束该过程。这可能是您想要和期望的。
  2. 来自在新测试运行时拒绝的承诺的未处理拒绝(不是启动承诺的测试)将使新测试失败,而不是原始测试失败。这令人困惑,并且可能导致难以跟踪错误。

作为上面提到的评论者,如果你的测试写得很好,那么你永远不应该遇到这种情况,但你并不总是有那么多的控制权。

  • “如果你的测试写得很好,那么你永远不应该遇到这种情况”这正是重点。我想添加此检查以确保我们在编写测试时不会意外错过异常。检查是为了确保我们不会搞乱测试。 (5认同)
  • 谢谢你的回答。我不明白为什么人们觉得他们不需要安全网。我们编写测试是因为我们的代码可能不完美,那么为什么我们觉得我们的测试代码会完美呢?!这让我感到困惑,我肯定会将其添加到我的代码中,希望它永远不需要运行。 (2认同)