vitest-skill:讓 AI 助手按 Vitest 規範寫單元與集成測試

前言

Vite 生態裏,Vitest 已是常見的單元測試選擇:與 Vite 共用配置與轉換管道,啓動和 watch 通常比傳統 Jest 鏈路更輕。團隊從 Jest 遷移時,最容易踩坑的是 mock 命名空間(jest.* 與 vi.*)、ESM 下的 vi.mock 提升,以及 vitest.config.ts 裏 environment、globals 等字段該怎麼配。

若把上述約定交給 AI 臨時「猜」,往往會出現 jest.fn()、漏寫 import { vi } from 'vitest',或配置與項目實際目錄不一致。vitest-skill 是 TestMu AI(原 LambdaTest)在 agent-skills 倉庫中維護的 Agent Skill,面向 Cursor、Claude Code、GitHub Copilot、Gemini CLI 等編碼助手,在用戶提到 Vitest、vi.mock、vitest.config 等關鍵詞時,引導生成符合 Vitest 習慣的 JavaScript/TypeScript 測試代碼。

這是什麼

vitest-skill 的定位是:在 AI 對話中生成 Vitest 單元測試與相關集成測試寫法,強調 Jest 兼容 API、ESM 支持,以及與 Vite 同源的測試運行方式。Skill 元數據標明作者爲 TestMu AI,版本 1.0,MIT 許可證,適用語言爲 JavaScript 與 TypeScript,分類爲 unit-testing。

官方 Skill 目錄:https://github.com/LambdaTest/agent-skills/tree/main/vitest-skill

觸發場景(來自 Skill 描述)包括用戶提及「Vitest」「vi.mock」「vitest.config」「vi.fn」「Vite test」「vitest config」等。

與同倉庫中的 Jest、Cypress 等 Skill 相比,vitest-skill 聚焦 Vite 項目內的 vi 命名空間、In-Source Testing、以及與 @testing-library/react 結合的組件測試模式,而不是瀏覽器 E2E 或純 Jest 默認棧。

核心功能

以下內容均來自官方 Skill 文檔與 Quick Reference,不展開未在資料中出現的能力。

基礎測試結構

Skill 內置 describe / it / expect / beforeEach 等典型寫法,並從 vitest 包顯式導入,示例如下。

import { describe, it, expect, vi, beforeEach } from 'vitest';
import { Calculator } from './calculator';

describe('Calculator', () => {
  let calc: Calculator;
  beforeEach(() => { calc = new Calculator(); });

  it('adds two numbers', () => {
    expect(calc.add(2, 3)).toBe(5);
  });

  it('throws on divide by zero', () => {
    expect(() => calc.divide(10, 0)).toThrow();
  });
});

Mock、Spy 與定時器(vi 而非 jest)

資料明確要求使用 vi.mock、vi.fn、vi.spyOn 以及 fake timers API,並在 Anti-Patterns 表中指出不應使用 jest.fn() / jest.mock()。

import { vi } from 'vitest';

vi.mock('./database', () => ({
  getUser: vi.fn().mockResolvedValue({ name: 'Alice' }),
  saveUser: vi.fn().mockResolvedValue(true),
}));

const mockFn = vi.fn();
mockFn.mockReturnValue(42);
mockFn.mockResolvedValue({ data: 'test' });

const spy = vi.spyOn(console, 'log').mockImplementation(() => {});
expect(spy).toHaveBeenCalledWith('message');
spy.mockRestore();

vi.useFakeTimers();
vi.advanceTimersByTime(1000);
vi.runAllTimers();
vi.useRealTimers();

In-Source Testing

支持在業務源碼中通過 import.meta.vitest 編寫同文件測試,需在 vitest.config 中配置 includeSource(見下文配置示例)。

Snapshot

包含 toMatchSnapshot 與 toMatchInlineSnapshot 示例。

React 組件測試

示例結合 @testing-library/react 的 render 與 screen,測試文件從 vitest 導入 describe / it / expect。

反模式對照

不推薦 推薦 說明
jest.fn() vi.fn() Vitest 使用 vi 命名空間
jest.mock() vi.mock() 與 Jest 命名空間不同
無類型約束 TypeScript + strict Skill 側強調 TS 優先

命令速查

任務 命令
單次運行 npx vitest run
Watch(默認) npx vitest
UI npx vitest --ui
覆蓋率 npx vitest --coverage
指定文件 npx vitest run src/math.test.ts
按用例名過濾 npx vitest run -t "adds"

推薦 vitest.config.ts 片段

Skill 文檔給出的生產向配置示例包含 globals、jsdom 環境、v8 覆蓋率與 includeSource:

import { defineConfig } from 'vitest/config';
export default defineConfig({
  test: {
    globals: true,
    environment: 'jsdom',
    coverage: { provider: 'v8', reporter: ['text', 'html'] },
    include: ['src/**/*.{test,spec}.{js,ts,tsx}'],
    includeSource: ['src/**/*.{js,ts}'],
  },
});

深度參考 playbook

更長的模式(工作區配置、React Testing Library、表驅動 test.each、API/集成測試、GitHub Actions CI、調試清單等)在 Skill 倉庫內的 reference/playbook.md,共 10 個章節;需要讓 AI 展開某類場景時,可在對話中點名 playbook 中的主題。

安裝與啓用

vitest-skill 隨 LambdaTest/agent-skills 發佈。倉庫 README 說明:需 Node.js 與 npm(建議最新穩定版)、可用的 AI 編碼助手,以及 TestMu AI 賬號的 username 與 access key(用於 agentskillsforall 相關流程)。

倉庫級初始化(可選)

若本地已有 agent-skills 克隆,可先安裝 CLI 依賴並註冊技能源:

git clone https://github.com/LambdaTest/agent-skills && cd agent-skills
npx agentskillsforall add https://github.com/LambdaTest/agent-skills.git

憑證環境變量(macOS / Linux):

export LT_USERNAME="YOUR_USERNAME"
export LT_ACCESS_KEY="YOUR_ACCESS_KEY"

Windows 使用 set LT_USERNAME=... 與 set LT_ACCESS_KEY=...(具體以官方文檔爲準)。

只安裝 vitest-skill

npx agentskillsforall add https://github.com/LambdaTest/agent-skills.git --skill vitest-skill

查看該源下全部 Skill:

npx agentskillsforall list https://github.com/LambdaTest/agent-skills.git

Cursor、Claude Code、Copilot 等助手的具體「技能掛載路徑」因產品版本而異;完整步驟見 TestMu AI Agent Skills 文檔。安裝完成後,在項目裏用自然語言描述測試需求即可,例如要求爲某個模塊補充 Vitest 用例並帶上 vi.mock。

典型用法

下面介紹幾種與官方示例一致、可直接對照倉庫覈對的用法。

1、爲純函數或類寫基礎用例

說明被測模塊路徑與邊界條件(異常、除零等),並明確要求使用 vitest 導入而非 jest。助手在 Skill 約束下應輸出與上文 Calculator 示例同結構的文件。

2、爲依賴外部模塊的代碼寫 mock

在對話中給出被 mock 的模塊路徑與期望返回值,並提到 vi.mock 或 vi.fn。Skill 資料中的 database mock 與 spy 片段可作爲預期形態。

3、React 組件

說明組件 props 與應出現在 DOM 中的文案,要求使用 @testing-library/react + Vitest。官方示例通過 screen.getByText 斷言。

4、與配置聯動

若項目使用 In-Source Testing,一併說明 vitest.config.ts 中 includeSource 與 import.meta.vitest 條件塊,避免只生成測試邏輯卻缺少配置。

5、本地執行驗證

生成代碼後,用 Skill Quick Reference 中的命令在本地驗證,例如:

npx vitest run
npx vitest run -t "adds"

適用場景與注意

適合:

  • Vite / Vitest 技術棧的前端或全棧 TypeScript 項目,需要 AI 生成或補全 *.test.ts / *.spec.tsx。
  • 從 Jest 遷移、希望輸出統一改爲 vi.* API 的團隊。
  • 需要 mock 模塊、fake timers、快照或 RTL 組件測試模板時,作爲對話中的「規範錨點」。

注意:

  • Skill 指導的是測試代碼與配置模式,不替代你在本機安裝 vitest、@vitejs/plugin-*、jsdom 等依賴;版本需與項目 package.json 一致,資料未綁定具體 Vitest 版本號。
  • Anti-Patterns 表僅覆蓋最常見的 jest 命名空間誤用;第三方庫若仍暴露 Jest 全局,需在項目層單獨處理。
  • reference/playbook.md 中的 CI、集成測試等屬於擴展閱讀,生成結果仍應經 npx vitest run 與 code review。
  • TestMu AI 雲平臺與 Tunnel 能力屬於 agent-skills 倉庫整體能力,vitest-skill 本身側重本地 Vitest 代碼生成;是否在雲上執行需結合其他 Skill 或自有 CI。

結尾

vitest-skill 把 Vitest 的導入方式、vi mock、配置字段和常用 CLI 收斂成 Agent 可複用的說明,減少 AI 在 Vite 項目裏寫出 Jest 習慣代碼的概率。若你已在用 Vitest 或正在配置 vitest.config,可將該 Skill 與倉庫內 Jest、Cypress 等 Skill 對照選用。

官方地址:https://github.com/LambdaTest/agent-skills/tree/main/vitest-skill

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

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

小夜