vitest
Vitestのテスト環境をあらゆるプロジェクトに構築します。プロジェクトの種類(Cloudflare Workers・React・Node・ライブラリ)を自動検出し、`vitest.config.ts`・テストセットアップ・ユーティリティ・サンプルテストを生成します。モックパターン・カバレッジ設定・ワークスペース構成・Jestからの移行にも対応しており、テストの追加・Vitestのセットアップ・Jestからの移行・テスト環境の修正など、テストに関する質問があれば積極的に活用してください。
description の原文を見る
Set up Vitest testing in any project — detects type (Cloudflare Workers, React, Node, library), generates vitest.config.ts, test setup, utilities, and a sample test. Covers mocking patterns, coverage config, workspace setup, Jest migration. Use whenever the user mentions adding tests, setting up Vitest, configuring tests, migrating from Jest, fixing testing infrastructure, or asks 'how do I test this'.
SKILL.md 本文
Vitest Setup
プロジェクトタイプを検出し、適切な Vitest 設定を生成し、機能するテストインフラストラクチャを提供します。リファレンスカードではなく、このスキルはファイルを作成します。
ワークフロー
- 検出 — プロジェクトをスキャンしてタイプと既存セットアップを特定
- 設定 — 環境に合わせた vitest.config.ts を生成
- スキャフォルド — テストセットアップ、ユーティリティ、サンプルテストを作成
- 配線 — package.json スクリプトと TypeScript 設定を追加
ステップ 1: プロジェクトタイプを検出
以下のファイルを読んでプロジェクトを特定します:
package.json → dependencies、scripts、type フィールド
tsconfig.json → paths、コンパイラオプション
wrangler.toml → Cloudflare Workers プロジェクト
vite.config.ts → 既存の Vite セットアップ(置き換えではなく拡張)
vitest.config.ts → すでに設定済み?ギャップを埋める
jest.config.* → マイグレーション候補
src/ → ソース構造
以下のいずれかに分類します:
| タイプ | 検出信号 | 環境 |
|---|---|---|
| Cloudflare Workers | wrangler.toml、@cloudflare/workers-types、cloudflare vite プラグイン | Workers 固有セットアップ付き node |
| React (Vite) | @vitejs/plugin-react、react-dom | jsdom または happy-dom |
| React (SSR/TanStack Start) | @tanstack/start、vinxi | 分割:サーバー用 node、クライアント用 jsdom |
| Node/Hono API | hono、express、react-dom なし | node |
| ライブラリ | exports フィールド、フレームワーク依存なし | node |
vite.config.ts がすでに存在する場合、別の vitest.config.ts を作成するのではなく拡張します。Vitest は Vite 設定をネイティブに読み込みます。
ステップ 2: 依存関係をインストール
検出されたタイプに基づいてインストールコマンドを生成します:
# ベース(常に)
pnpm add -D vitest
# React プロジェクト — jsdom と Testing Library を追加
pnpm add -D @vitest/coverage-v8 jsdom @testing-library/react @testing-library/jest-dom @testing-library/user-event
# Workers プロジェクト — Cloudflare テストユーティリティを追加
pnpm add -D @vitest/coverage-v8 @cloudflare/vitest-pool-workers
# Node/Hono プロジェクト
pnpm add -D @vitest/coverage-v8
# Jest からマイグレーション中の場合は、以下も削除:
pnpm remove jest ts-jest @types/jest jest-environment-jsdom babel-jest
プロジェクトのパッケージマネージャを使用します(pnpm-lock.yaml、yarn.lock、bun.lockb、または package-lock.json をチェック)。
ステップ 3: vitest.config.ts を生成
Cloudflare Workers
import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config";
export default defineWorkersConfig({
test: {
globals: true,
poolOptions: {
workers: {
wrangler: { configPath: "./wrangler.toml" },
},
},
},
});
プロジェクトが Cloudflare Vite プラグイン(@cloudflare/vite-plugin)を使用する場合は、代わりに既存の vite.config.ts に統合します:
/// <reference types="vitest/config" />
import { defineConfig } from "vite";
import { cloudflare } from "@cloudflare/vite-plugin";
export default defineConfig({
plugins: [cloudflare()],
test: {
globals: true,
},
});
React (Vite)
/// <reference types="vitest/config" />
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
test: {
globals: true,
environment: "jsdom",
setupFiles: ["./src/test/setup.ts"],
css: true,
},
});
vite.config.ts がすでに存在する場合は、新しいファイルを作成するのではなく test ブロックを追加します。
Node / Hono API
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
globals: true,
environment: "node",
},
});
カバレッジ付き(任意の設定に追加)
test: {
// ... 既存の設定
coverage: {
provider: "v8",
reporter: ["text", "html", "lcov"],
exclude: [
"node_modules/",
"**/*.config.*",
"**/*.d.ts",
"**/test/**",
],
},
},
ステップ 4: テストセットアップファイルを生成
src/test/setup.ts を作成します(React プロジェクトのみ):
import "@testing-library/jest-dom/vitest";
この単一インポートは、すべてのカスタムマッチャー(toBeInTheDocument、toHaveTextContent など)を追加し、Vitest expect.extend を自動的に登録します。
ステップ 5: TypeScript 設定を追加
tsconfig.json の compilerOptions に追加:
{
"compilerOptions": {
"types": ["vitest/globals"]
}
}
複数の tsconfig ファイルを持つプロジェクト(例えば tsconfig.app.json + tsconfig.node.json)の場合は、テストファイルをカバーするものに追加します。通常はルート tsconfig.json または、それを拡張する tsconfig.test.json です。
ステップ 6: package.json スクリプトを追加
{
"scripts": {
"test": "vitest",
"test:run": "vitest run",
"test:coverage": "vitest run --coverage",
"test:ui": "vitest --ui"
}
}
既存のスクリプトを上書きしないでください。既存のものとマージします。
ステップ 7: サンプルテストを生成
このプロジェクトの正しいパターンを示す 1 つのテストファイルを作成します。別の __tests__ ディレクトリではなく、実際のソースコードの隣に配置します。
Hono API ルート用(例:src/routes/health.ts):
import { describe, it, expect } from "vitest";
import { app } from "../index";
describe("GET /health", () => {
it("returns 200 with status ok", async () => {
const res = await app.request("/health");
expect(res.status).toBe(200);
const body = await res.json();
expect(body).toEqual({ status: "ok" });
});
});
React コンポーネント用(例:src/components/Button.tsx):
import { describe, it, expect } from "vitest";
import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { Button } from "./Button";
describe("Button", () => {
it("renders with label", () => {
render(<Button>Click me</Button>);
expect(screen.getByRole("button", { name: /click me/i })).toBeInTheDocument();
});
it("calls onClick when clicked", async () => {
const user = userEvent.setup();
const handleClick = vi.fn();
render(<Button onClick={handleClick}>Click me</Button>);
await user.click(screen.getByRole("button"));
expect(handleClick).toHaveBeenCalledOnce();
});
});
ユーティリティ関数用(例:src/utils/format.ts):
import { describe, it, expect } from "vitest";
import { formatCurrency } from "./format";
describe("formatCurrency", () => {
it("formats whole numbers", () => {
expect(formatCurrency(1000)).toBe("$1,000.00");
});
it("formats decimals", () => {
expect(formatCurrency(49.9)).toBe("$49.90");
});
it("handles zero", () => {
expect(formatCurrency(0)).toBe("$0.00");
});
});
プロジェクトから実際のファイルを選択してテストします。架空のモジュールを作ってはいけません。サンプルテストはセットアップ直後にすぐ実行できるべきです。
ステップ 8: 検証
テストを実行してすべてが機能していることを確認します:
pnpm test:run
失敗する場合は、診断と修正を行います。よくある問題:
| エラー | 修正方法 |
|---|---|
Cannot find module 'vitest' | インストール完了を確認、node_modules/.vitest の存在をチェック |
ReferenceError: describe is not defined | 設定に globals: true を追加、または tsconfig に types: ["vitest/globals"] を追加 |
document is not defined | 環境が間違っている。React テスト用に environment: "jsdom" を設定 |
Cannot use import.meta | vitest.config が .ts 拡張子を使用していることを確認、プロジェクトに "type": "module" があるか Vite が変換を処理していることを確認 |
| Workers バインディングが未定義 | 素の vitest ではなく @cloudflare/vitest-pool-workers を使用、wrangler.toml パスをチェック |
モッキングリファレンス
これらのパターンはセットアップ完了後にテストを書くためのものです。サンプルテストに含めるか、ユーザーがモッキング例を求めた場合は src/test/examples.test.ts に含めます。
モジュールモッキング(vi.mock)
import { vi, describe, it, expect } from "vitest";
import { getUser } from "./api";
vi.mock("./api", () => ({
getUser: vi.fn(),
}));
it("mocks a module function", async () => {
vi.mocked(getUser).mockResolvedValue({ id: 1, name: "Test" });
const user = await getUser(1);
expect(user.name).toBe("Test");
expect(getUser).toHaveBeenCalledWith(1);
});
メソッドをスパイ(vi.spyOn)
it("spies on console.warn", () => {
const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
doSomethingThatWarns();
expect(spy).toHaveBeenCalledOnce();
spy.mockRestore();
});
フェイクタイマー
import { vi, beforeEach, afterEach, it, expect } from "vitest";
beforeEach(() => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2026-01-15T10:00:00Z"));
});
afterEach(() => {
vi.useRealTimers();
});
it("uses controlled time", () => {
expect(new Date().toISOString()).toBe("2026-01-15T10:00:00.000Z");
});
グローバルスタブ
it("stubs fetch", async () => {
const mockFetch = vi.fn().mockResolvedValue({
ok: true,
json: () => Promise.resolve({ data: "test" }),
});
vi.stubGlobal("fetch", mockFetch);
const res = await fetch("/api/data");
expect(mockFetch).toHaveBeenCalledWith("/api/data");
vi.unstubAllGlobals();
});
スナップショットテスト
it("matches snapshot", () => {
const result = generateConfig({ debug: true });
expect(result).toMatchSnapshot();
});
it("matches inline snapshot", () => {
expect({ status: "ok", count: 3 }).toMatchInlineSnapshot(`
{
"count": 3,
"status": "ok",
}
`);
});
パラメータ化テスト
describe.each([
{ input: "hello", expected: "HELLO" },
{ input: "world", expected: "WORLD" },
{ input: "", expected: "" },
])("toUpperCase($input)", ({ input, expected }) => {
it(`returns ${expected}`, () => {
expect(input.toUpperCase()).toBe(expected);
});
});
Jest マイグレーション
検出されたプロジェクトが Jest(jest.config.*、@types/jest、依存関係に ts-jest がある)を持つ場合:
- 上記のステップを使用して vitest.config.ts を生成
- 既存のテストファイルのインポートを更新:
// Before
import { jest } from "@jest/globals";
jest.mock("./api");
jest.fn();
jest.spyOn(obj, "method");
// After
import { vi } from "vitest";
vi.mock("./api");
vi.fn();
vi.spyOn(obj, "method");
- Jest パッケージを削除:
pnpm remove jest ts-jest @types/jest jest-environment-jsdom babel-jest @jest/globals
-
tsconfig を更新 —
"types": ["jest"]を"types": ["vitest/globals"]に置き換え -
テストを実行し、残りの問題を修正
主な置き換え:
| Jest | Vitest |
|---|---|
jest.fn() | vi.fn() |
jest.mock() | vi.mock() |
jest.spyOn() | vi.spyOn() |
jest.useFakeTimers() | vi.useFakeTimers() |
jest.clearAllMocks() | vi.clearAllMocks() |
jest.requireActual() | vi.importActual() |
@jest/globals | vitest |
jest.config.js | vitest.config.ts |
ワークスペースセットアップ(モノレポ)
複数のパッケージを持つモノレポプロジェクトの場合:
// vitest.workspace.ts
import { defineWorkspace } from "vitest/config";
export default defineWorkspace([
"packages/*/vitest.config.ts",
]);
各パッケージは独自の設定を持ちます。ワークスペースファイルは単にそれらをポイントします。
このスキルが生成するもの
実行後、プロジェクトは以下を持つべきです:
vitest.config.ts(または既存の vite.config.ts に追加されたテストブロック)src/test/setup.ts(React プロジェクト)- vitest/globals タイプで更新された
tsconfig.json - テストスクリプトで更新された
package.json - 実際のソースコードに対する少なくとも 1 つのパスするサンプルテスト
- インストールされた依存関係
テストは初回実行時にパスすべきです。そうでない場合は、終了する前に修正してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- jezweb
- リポジトリ
- jezweb/claude-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/jezweb/claude-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。