# vitest-test-creator > Vitest を使用したテストコード作成・リファクタリング・デバッグ。ユニットテスト(.unit.test.ts)、Reactコンポーネント・Hooksテスト(.browser.test.tsx)、APIハンドラテストに対応。「テストを書いて」「テストケースを追加して」「テストをリファクタリングして」「テストコードを整理して」「このテストをガイドラインに沿って修正して」などのリクエストで使用。.test.ts/.test.tsx ファイルの作成・編集・改善が必要な場合に活用。 - Author: naopoyo - Repository: hackersheet/javascript - Version: 20260126161247 - Stars: 1 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/hackersheet/javascript - Web: https://mule.run/skillshub/@@hackersheet/javascript~vitest-test-creator:20260126161247 --- --- name: vitest-test-creator description: Vitest を使用したテストコード作成・リファクタリング・デバッグ。ユニットテスト(.unit.test.ts)、Reactコンポーネント・Hooksテスト(.browser.test.tsx)、APIハンドラテストに対応。「テストを書いて」「テストケースを追加して」「テストをリファクタリングして」「テストコードを整理して」「このテストをガイドラインに沿って修正して」などのリクエストで使用。.test.ts/.test.tsx ファイルの作成・編集・改善が必要な場合に活用。 --- # Vitest Test Creator ## 🚀 クイックスタート ### ユニットテスト(純粋な関数) ```typescript // src/utils/__tests__/sum.unit.test.ts import { describe, it, expect } from 'vitest'; import { sum } from '../sum'; describe('sum', () => { it('2つの数を足す', () => { expect(sum(2, 3)).toBe(5); }); }); ``` ### ブラウザテスト(Reactコンポーネント) ```typescript // src/components/__tests__/Button.browser.test.tsx import { render, cleanup } from '@testing-library/react' import { describe, it, expect, afterEach } from 'vitest' import { Button } from '../Button' describe('Button', () => { afterEach(() => cleanup()) it('ボタンが表示される', () => { const { container } = render() expect(container.querySelector('button')).toBeInTheDocument() }) }) ``` --- ## テストタイプの選択 | テストタイプ | ファイル名 | 対象 | 環境 | | ------------ | -------------------- | ------------------------------------------------- | ---------- | | **ユニット** | `*.unit.test.ts` | 純粋な関数・ロジック(utils/, lib/) | Node.js | | **ブラウザ** | `*.browser.test.tsx` | Reactコンポーネント・Hooks(components/, hooks/) | Playwright | 詳細は [file-layout.md](references/file-layout.md) を参照。 --- ## 基本構造 ### ユニットテストの基本 ```typescript import { describe, it, expect, beforeEach } from 'vitest'; import { targetFunction } from '../target'; describe('targetFunction', () => { beforeEach(() => { // セットアップ }); it('期待する動作を説明する', () => { // Arrange(準備) const input = 'test'; // Act(実行) const result = targetFunction(input); // Assert(検証) expect(result).toBe('expected'); }); }); ``` ### ブラウザテストの基本 ```typescript import { render, cleanup } from '@testing-library/react' import { describe, it, expect, afterEach } from 'vitest' import userEvent from '@testing-library/user-event' import { Component } from '../Component' describe('Component', () => { afterEach(() => cleanup()) it('ボタンクリックで onClick を呼び出す', async () => { const user = userEvent.setup() const onClick = vi.fn() const { container } = render() const button = container.querySelector('button') await user.click(button!) expect(onClick).toHaveBeenCalledOnce() }) }) ``` 詳細な例とベストプラクティスは [unit-testing.md](references/unit-testing.md) と [browser-testing.md](references/browser-testing.md) を参照。 --- ## テスト実行コマンド | 用途 | コマンド | | -------------------- | ---------------------------------------------------------------- | | **特定ファイル実行** | `pnpm test:run src/components/__tests__/Button.browser.test.tsx` | | **パターンマッチ** | `pnpm test:run bookmark` | | **全テスト実行** | `pnpm test:run` | | **カバレッジ付き** | `pnpm test:coverage` | 詳細なワークフロー(Watch モード、複数ファイル実行など)は [workflow.md](references/workflow.md) を参照。 --- ## よくあるトラブル(TOP 3) ### ❌ jest-dom マッチャーが見つからない **エラー:** `Property 'toBeInTheDocument' does not exist` **解決:** - テストファイルが `.browser.test.tsx` 拡張子か確認 - `vitest.setup.ts` に `import '@testing-library/jest-dom/vitest'` があるか確認 ### ❌ `screen.getByRole()` で複数要素エラー **エラー:** `Found multiple elements with role "searchbox"` **解決:** `container.querySelector()` を使用するか、`afterEach(() => cleanup())` を追加 ### ❌ テストがタイムアウト **エラー:** `Timeout of XXXX ms` **解決:** - 非同期テストに `await` があるか確認 - `vi.useFakeTimers()` を使用している場合は `vi.runAllTimers()` を追加 すべてのトラブルシューティングは [troubleshooting.md](references/troubleshooting.md) を参照。 --- ## アサーション・マッチャー ### 基本的なマッチャー ```typescript expect(value).toBe(expected); // 厳密等価 expect(value).toEqual(expected); // 深い等価 expect(value).toContain('substring'); // 包含 expect(array).toHaveLength(3); // 配列の長さ expect(() => fn()).toThrow(); // エラー await expect(asyncFn()).resolves.toBe(value); // 非同期 ``` ### jest-dom マッチャー(ブラウザテスト推奨) ```typescript expect(element).toBeInTheDocument(); // DOM に存在 expect(element).toHaveAttribute('name', 'keyword'); // 属性確認 expect(element).toHaveClass('text-base'); // クラス名確認 expect(element).toBeVisible(); // 表示状態 expect(element).toBeDisabled(); // disabled 確認 ``` 詳細は [jest-dom-matchers.md](references/jest-dom-matchers.md) を参照。 --- ## モック ### 関数モック ```typescript import { vi } from 'vitest'; const mockFn = vi.fn(); mockFn.mockReturnValue('value'); mockFn.mockResolvedValue('async value'); mockFn.mockImplementation((x) => x * 2); ``` ### モジュールモック ```typescript vi.mock('./api', () => ({ fetchUser: vi.fn(), })); ``` ### next/link のモック(Next.js) ```typescript vi.mock('next/link', () => ({ __esModule: true, default: ({ children, href }: any) => ( {children} ), })) ``` 詳細と Next.js hooks モック、テスト後のリセット方法は [mocking.md](references/mocking.md) を参照。 --- ## ファイル配置・命名規則 テストファイルは対象と同じ階層の `__tests__/` に配置: ```text src/ ├── utils/ │ ├── __tests__/ │ │ └── create-date-format.unit.test.ts │ └── create-date-format.ts ├── components/ │ ├── Button/ │ │ ├── __tests__/ │ │ │ └── Button.browser.test.tsx │ │ └── Button.tsx ``` 複数関連ファイルの場合は親フォルダに一つ `__tests__/` を作成。 詳細は [file-layout.md](references/file-layout.md) を参照。 --- ## 次のステップ - **ユニットテスト詳細** → [unit-testing.md](references/unit-testing.md) - **ブラウザテスト詳細** → [browser-testing.md](references/browser-testing.md) - **モック完全ガイド** → [mocking.md](references/mocking.md) - **jest-dom マッチャー** → [jest-dom-matchers.md](references/jest-dom-matchers.md) - **開発ワークフロー** → [workflow.md](references/workflow.md) - **トラブルシューティング** → [troubleshooting.md](references/troubleshooting.md)