Jest 在节点 v16.13.0 中找不到 AbortController

Vic*_*tor 7 node.js jestjs

我正在使用 Jest 来运行我的测试。从 v12 升级到 Node v16.13.0(LTS 版本)后,出现以下错误:

ReferenceError:未定义 AbortController

而使用 Node 手动运行代码效果很好。

在升级到 v16 的过程中,我将所有软件包升级到了最新版本。我一直在为模拟 AbortController 使用 polyfill,因为我在升级之前使用的是 Node v12。Node v16 带有它自己的 AbortController,所以我删除了这个 polyfill。我正在使用 TypeScript 4.4.4,以防相关(这不是 TypeScript 错误)。

使用 Polyfill 时不会出现此错误。

与我使用 Node.js 手动运行应用程序时相比,Jest 运行时似乎没有使用相同的环境。

我尝试了以下方法:

  • 使用 nvm 将 Node v16.13.0 设置为默认版本
  • 删除除 v16.13.0 之外安装的所有其他版本的 Node
  • console.log(process.env)在测试开始时运行并检查正在使用的 Node 版本 -> 对 Node 的所有引用都具有相同的版本:16.13.0。

我已经研究了几个小时了,似乎互联网上没有人遇到这个问题。有谁知道发生了什么事吗?

Vic*_*tor 8

经过更多挖掘后,我“解决”了这个问题。只需删除 "testEnvironment": "node"(内部"jest": {...}从 package.json 中

\n

我偶然发现了设置 Jest 测试环境的选项(https://jestjs.io/docs/configuration#testenvironment-string),并且我注意到我的 package.json 已经包含该设置(在 下"jest": {...})并且它被设置为:"testEnvironment": "node":然而,根据文档,这是默认的,所以我没有想到任何事情。

\n

几个小时后,在绝望中我决定将其删除......瞧\xc3\xa0,它解决了问题。

\n

显然设置"testEnvironment"配置设置为其默认值会改变 Jest 的运行环境,这对我来说非常违反直觉且令人困惑。

\n

编辑:这是由 Create React App 引起的。我将只安装了 jest 的空存储库与 CRA 存储库进行了比较,后者附带了 jest。将测试命令更改为jest并添加上述配置会触发问题。如果您使用默认react-scripts test命令,CRA 将不会运行测试并给您一个大红色错误,表明他们不支持"testEnvironment"设置。

\n

  • 这是一个有趣的发现,我希望它是 Jest bug 或者你这边的一些怪癖,通过配置更改神奇地修复了。我不明白 testEnvironment 是如何导致这种情况的,考虑到它已经默认为“node”(仅在最后一个 Jest 版本中),并且 `global.AbortController` 已经在 Node 16 中可用。如果您可以重现它,请考虑发布Jest 存储库中的问题。 (3认同)