入门
使用您喜欢的包管理器安装 Jest
- npm
- Yarn
- pnpm
npm install --save-dev jest
yarn add --dev jest
pnpm add --save-dev jest
让我们从为一个假设的函数编写测试开始,该函数将两个数字相加。首先,创建一个名为 sum.js 的文件
function sum(a, b) {
return a + b;
}
module.exports = sum;
然后,创建一个名为 sum.test.js 的文件。这将包含我们的实际测试
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
将以下部分添加到您的 package.json 中
{
"scripts": {
"test": "jest"
}
}
最后,运行 yarn test 或 npm test,Jest 将打印此消息
PASS ./sum.test.js
✓ adds 1 + 2 to equal 3 (5ms)
您刚刚成功使用 Jest 编写了第一个测试!
此测试使用 expect 和 toBe 来测试两个值是否完全相同。要了解 Jest 可以测试的其他内容,请参阅 使用匹配器.
从命令行运行
您可以直接从 CLI 运行 Jest(如果它在您的 PATH 中全局可用,例如通过 yarn global add jest 或 npm install jest --global),并使用各种有用的选项。
以下是如何在与 my-test 匹配的文件上运行 Jest,使用 config.json 作为配置文件,并在运行后显示本机操作系统通知
jest my-test --notify --config=config.json
如果您想了解更多关于通过命令行运行 jest 的信息,请查看 Jest CLI 选项 页面。
其他配置
生成基本配置文件
根据您的项目,Jest 会问您一些问题,并创建一个基本配置文件,其中包含每个选项的简短描述
- npm
- Yarn
- pnpm
npm init jest@latest
yarn create jest@latest
pnpm create jest@latest
使用 Babel
要使用 Babel,请安装所需的依赖项
- npm
- Yarn
- pnpm
npm install --save-dev babel-jest @babel/core @babel/preset-env
yarn add --dev babel-jest @babel/core @babel/preset-env
pnpm add --save-dev babel-jest @babel/core @babel/preset-env
通过在项目的根目录中创建一个 babel.config.js 文件,将 Babel 配置为针对您当前的 Node 版本
module.exports = {
presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
};
Babel 的理想配置将取决于您的项目。有关更多详细信息,请参阅 Babel 的文档。
使您的 Babel 配置支持 Jest
如果 process.env.NODE_ENV 未设置为其他值,Jest 将将其设置为 'test'。您可以在配置中使用它来有条件地仅设置 Jest 所需的编译,例如
module.exports = api => {
const isTest = api.env('test');
// You can use isTest to determine what presets and plugins to use.
return {
// ...
};
};
babel-jest 在安装 Jest 时会自动安装,如果您的项目中存在 babel 配置,它会自动转换文件。要避免此行为,您可以显式重置 transform 配置选项
module.exports = {
transform: {},
};
使用 webpack
Jest 可用于使用 webpack 管理资产、样式和编译的项目。webpack 在其他工具之上提供了一些独特的挑战。请参阅 webpack 指南 以开始使用。
使用 Vite
Jest 可用于使用 vite 通过原生 ESM 提供前端工具的项目,vite 是一个有主见的工具,并提供了一些开箱即用的工作流程。由于 vite 的插件系统 的工作方式,Jest 并未完全受 vite 支持,但有一些使用 vite-jest 进行一流 Jest 集成的有效示例,由于这并未完全受支持,您也可以阅读 vite-jest 的限制。请参阅 vite 指南 以开始使用。
使用 Parcel
Jest 可用于使用 parcel-bundler 管理资产、样式和编译的项目,类似于 webpack。Parcel 不需要任何配置。请参阅官方 文档 以开始使用。
使用 TypeScript
通过 babel
Jest 通过 Babel 支持 TypeScript。首先,确保您已按照上述 使用 Babel 的说明进行操作。接下来,安装 @babel/preset-typescript
- npm
- Yarn
- pnpm
npm install --save-dev @babel/preset-typescript
yarn add --dev @babel/preset-typescript
pnpm add --save-dev @babel/preset-typescript
然后将 @babel/preset-typescript 添加到 babel.config.js 中的预设列表中。
module.exports = {
presets: [
['@babel/preset-env', {targets: {node: 'current'}}],
'@babel/preset-typescript',
],
};
但是,使用 Babel 与 TypeScript 存在一些 注意事项。由于 Babel 中的 TypeScript 支持纯粹是转译,因此 Jest 不会在运行测试时对测试进行类型检查。如果您需要类型检查,可以使用 ts-jest,或者单独运行 TypeScript 编译器 tsc(或作为构建过程的一部分)。
通过 ts-jest
ts-jest 是一个带有源映射支持的 TypeScript 预处理器,用于 Jest,它允许您使用 Jest 测试用 TypeScript 编写的项目。
- npm
- Yarn
- pnpm
npm install --save-dev ts-jest
yarn add --dev ts-jest
pnpm add --save-dev ts-jest
为了让 Jest 使用 ts-jest 转译 TypeScript,您可能还需要创建一个 配置文件。
类型定义
有两种方法可以为用 TypeScript 编写的测试文件键入 Jest 全局 API。
您可以使用随 Jest 一起提供的类型定义,这些类型定义将在每次更新 Jest 时更新。安装 @jest/globals 包
- npm
- Yarn
- pnpm
npm install --save-dev @jest/globals
yarn add --dev @jest/globals
pnpm add --save-dev @jest/globals
并从其中导入 API
import {describe, expect, test} from '@jest/globals';
import {sum} from './sum';
describe('sum module', () => {
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
});
请参阅 describe.each/test.each 和 模拟函数 的其他使用文档。
或者,您可以选择安装 @types/jest 包。它为 Jest 全局变量提供类型,无需导入它们。
- npm
- Yarn
- pnpm
npm install --save-dev @types/jest
yarn add --dev @types/jest
pnpm add --save-dev @types/jest
@types/jest 是一个由 DefinitelyTyped 维护的第三方库,因此最新的 Jest 功能或版本可能尚未涵盖。尝试尽可能匹配 Jest 和 @types/jest 的版本。例如,如果您使用的是 Jest 27.4.0,那么安装 27.4.x 的 @types/jest 是理想的选择。
使用 ESLint
只要您在测试文件中使用它们之前从 @jest/globals 导入 Jest 全局帮助程序(describe、it 等),Jest 就可以与 ESLint 一起使用,无需任何其他配置。这是为了避免来自 ESLint 的 no-undef 错误,ESLint 不了解 Jest 全局变量。
如果您想避免这些导入,您可以配置您的 ESLint 环境 以支持这些全局变量,方法是添加 jest 环境
{
"overrides": [
{
"files": ["tests/**/*"],
"env": {
"jest": true
}
}
]
}
或者使用 eslint-plugin-jest,它具有类似的效果
{
"overrides": [
{
"files": ["tests/**/*"],
"plugins": ["jest"],
"env": {
"jest/globals": true
}
}
]
}