前言¶
补 Jest 测试时,常见卡点不是不会写 describe / it,而是 Mock 模块、异步断言、React 组件交互和快照该怎么组织,以及哪些写法容易让测试假通过。手写样板和查文档都费时间。下面介绍 LambdaTest agent-skills 仓库中的 jest-skill:在对话里提到 Jest、Mock、快照或 React 测试时,引导 Agent 按统一模式产出 JavaScript / TypeScript 测试代码。
这是什么¶
jest-skill 是一条面向 Jest 的 Agent Skill,元数据说明其用于生成 Jest 单元测试与集成测试,覆盖 Mock、快照、异步测试,以及基于 React Testing Library 的组件测试。维护方在 Skill 元数据中标注为 TestMu AI,许可证为 MIT,分类为 unit-testing,支持语言为 JavaScript 与 TypeScript。
在 LambdaTest 的官方测试 Skill 系列里,它是与单元测试场景直接对应的一条;Jest 仍是 JavaScript 生态里使用最广的测试框架之一,这条 Skill 把框架常见模式收进一份可复用的说明,而不是零散提示词。
官方目录:https://github.com/LambdaTest/agent-skills/tree/main/jest-skill
核心功能¶
以下能力均来自官方 Skill 文档中的 Core Patterns 与 Quick Reference。
触发与定位
当用户提到 Jest、describe / it / expect、jest.mock、toMatchSnapshot、snapshot test、JS test、React test 等时,适合启用该 Skill。
基础结构与断言
提供 describe / test / beforeEach 示例,以及常用 matcher:toBe、toEqual、toBeTruthy、toMatch、toContain、toHaveLength、toHaveProperty、toMatchObject、toThrow 等。
Mock
包含 jest.fn()、mockReturnValue / mockResolvedValue、模块级 jest.mock、带 factory 的 mock、jest.spyOn、假定时器 jest.useFakeTimers / advanceTimersByTime。
异步
async / await 测试,以及 resolves / rejects 断言写法。
React 组件
示例使用 @testing-library/react 的 render、screen、fireEvent、waitFor,并配合 @testing-library/jest-dom;场景为表单填写与提交回调断言。
快照
使用 react-test-renderer 的 toMatchSnapshot();更新快照命令为 jest --updateSnapshot。
反模式对照
文档用表格说明:避免 expect(x === y).toBe(true)、异步未 await、对所有内容滥用快照等问题。
进阶参考
仓库内 reference/playbook.md 列出生产向主题(配置、深度 Mock、test.each、自定义 matcher、RTL 进阶、API 服务测试、全局 setup、CI/CD、排错表、实践清单等);需要落地大型项目时可对照该文件,正文不展开未在 Core 节出现的细节。
安装与启用¶
jest-skill 以通用 SKILL.md 形式存放在官方仓库的 jest-skill 目录下。将对应目录纳入你所用 Agent 产品的 Skill 加载路径(具体字段与命令以该产品文档为准);本资料未提供 Cursor、Codex CLI、Claude Code 的差异化安装命令,此处不臆造步骤。
获取源码位置:
https://github.com/LambdaTest/agent-skills/tree/main/jest-skill
Skill 元数据中的 name 为 jest-skill,metadata.version 为 1.0。
典型用法¶
基础单元测试¶
先搭 describe 与 beforeEach,再对正常路径与异常路径分别写 test:
describe('Calculator', () => {
let calc;
beforeEach(() => { calc = new Calculator(); });
test('adds two numbers', () => {
expect(calc.add(2, 3)).toBe(5);
});
test('throws on division by zero', () => {
expect(() => calc.divide(10, 0)).toThrow('Division by zero');
});
});
Mock 模块与 spy¶
对外部依赖用 jest.mock,在测试里设定 mockResolvedValue 并断言调用参数:
jest.mock('./database');
const db = require('./database');
db.getUser.mockResolvedValue({ name: 'Alice' });
对已有实现做观测时,用 jest.spyOn 并在结束后 mockRestore()。
异步¶
Promise 结果用 await 或 return expect(promise).resolves.toEqual(...);失败路径用 rejects.toThrow。
React 表单交互¶
按标签或角色查询元素,模拟输入与点击,用 waitFor 等待回调被调用:
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import '@testing-library/jest-dom';
import LoginForm from './LoginForm';
test('submits login form', async () => {
const onSubmit = jest.fn();
render(<LoginForm onSubmit={onSubmit} />);
fireEvent.change(screen.getByLabelText('Email'), {
target: { value: 'user@test.com' },
});
fireEvent.change(screen.getByLabelText('Password'), {
target: { value: 'password123' },
});
fireEvent.click(screen.getByRole('button', { name: /login/i }));
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledWith({
email: 'user@test.com', password: 'password123',
});
});
});
常用命令¶
| 任务 | 命令 |
|---|---|
| 运行全部 | npx jest |
| 监听模式 | npx jest --watch |
| 覆盖率 | npx jest --coverage |
| 更新快照 | npx jest --updateSnapshot |
| 指定文件 | npx jest tests/calc.test.js |
| 单测调试 | test.only('name', () => {}) |
适用场景与注意¶
适合
已有或计划使用 Jest 的 JS/TS 项目;需要快速生成带 Mock、异步和 RTL 风格的测试草稿;希望 Agent 输出与 Jest 惯用写法一致(matcher、mock、反模式提醒)。
注意
Skill 指导的是测试代码模式,不替代项目里真实的 jest.config、Babel/TS 转译和依赖安装;React 示例依赖 Testing Library 与 jest-dom,需在工程中自行配置。快照适合 UI 结构回归,业务逻辑仍应以明确断言为主。生产级配置与 CI 门槛请结合仓库内 reference/playbook.md。
结尾¶
jest-skill 把 Jest 的主流写法(断言、Mock、异步、RTL、快照)和常用 CLI 收进一条 Skill,便于在编码 Agent 对话里稳定产出可运行的测试骨架。官方地址:https://github.com/LambdaTest/agent-skills/tree/main/jest-skill