jest-skill:为 Jest 生成单元与集成测试的 Agent Skill

前言

补 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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜