前言¶
補 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