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

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

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

小夜