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

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

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

小夜