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

时间:2018-06-29 16:02:32

标签: javascript promise jestjs

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

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

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

我试图将事件监听器挂接到安装脚本中

/* jest.config.js */
module.exports = {
    setupFiles: ['<rootDir>/test/setup.ts'],
    // ...
}

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

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

3 个答案:

答案 0 :(得分:2)

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

module.exports = {
  ...
  setupFiles: ['<rootDir>/test/setup.js'],
  ...
};

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

process.on('unhandledRejection', (err) => {
  fail(err);
});

unhandledRejection将通过测试,尽管需要注意两个注意事项:

  1. 未执行测试时拒绝的承诺中未处理的拒绝将结束流程。这可能就是您想要和期望的。
  2. 未处理的来自承诺的拒绝会在新测试运行时拒绝(而不是发起承诺的那个)将使新测试失败,而不是原始测试失败。这令人困惑,并且可能导致难以跟踪错误。

正如上面提到的评论者,如果您的测试写得很好,那么您永远都不会遇到这种情况,但是您并不总是拥有那么多的控制权。

答案 1 :(得分:0)

运行jest时添加以下标志对我有用:

--detectOpenHandles --forceExit --runInBand 

答案 2 :(得分:0)

除了@ andrew-eisenberg答案外,您还可以按以下方式在package.json中配置安装文件:

"jest": {
  ...
  "setupFiles": ["<rootDir>/../test/setup.ts"],
  ...
}

src doc