编写使用 Flow 验证的 Jest 测试的正确方法是什么?

What's the right way to write Jest tests verified with Flow?

我想人们通常会一起使用 Flow 和 Jest(以及 React),但 Flow 似乎不知道 Jest(或 Jasmine)全局变量。当我将 // @flow 添加到我的测试中时,我收到如下 Flow 错误:

src/__tests__/Thing-test.js:3
  3: jest.unmock('../Thing')
     ^^^^ identifier `jest`. Could not resolve name

src/__tests__/Thing-test.js:7
  7: describe('Thing', () => {
     ^^^^^^^^ identifier `describe`. Could not resolve name

src/__tests__/Thing-test.js:8
  8:   it('does stuff', () => {
       ^^ identifier `it`. Could not resolve name

我可以为 Jest/Jasmine 编写一个 Flow 接口,但这看起来很冗长,而且我肯定遗漏了什么。让 Flow 过程 node_modules/jest-cli 似乎没有帮助。

我认为 declare var jest: any; 应该可以解决问题(将它放在每个测试文件的顶部,或者放在您的流程库目录中的某个位置)。

尽管 Jest 是使用流注释编写的,但它们会去除 npm 版本的类型,因此我们不需要 babel 来 运行 它。幸运的是,类型已经在 flow-type 中,所以解决方案很简单(正如评论中提到的):

npm install -g flow-typed

flow-typed install jest@22.x.x # <-- replace the version with the latest

尽管我也必须将这一行添加到我的 .eslintrc.json:

{
  "env": {
    "jest": true
  }
}

如果您使用 create-react-app 创建项目,则必须手动将 jest 添加到您的 packages.json。否则 flow-typed 不会安装所需的类型定义,因为 create-react-app 不会将此依赖项添加到 packages.json.

yarn add --dev jest
flow-typed install

如果您使用 Create-React-App,则接受的答案将不起作用。以下是使用 CRA 设置 jest 的方法:

1.Install流向你的项目

如果您使用 create-reat-app,here 是此步骤的指南。

yarn add -D flow-bin
yarn run flow init

2。安装 jest 流类型

npx flow-typed install jest@22 // maybe you need a different version

(如果你使用 create-react-app,你可以使用 npx jest -v 来检查你的 jest 版本。)

3。在 config

中注册流类型

(更新:正如@Black 在评论中指出的那样,这一步甚至可能不是必需的)

在您的 .flowconfig 中,将流类型添加到库部分。

...
[libs]
flow-typed
...

我使用 yarn,npm 应该也能正常工作。

您也可以 运行 将它作为一个衬里。 给你:

npm i -D flow-typed && npx flow-typed install jest@"$(npx jest -v)"