vitest-testing について
アサーション、非同期テスト、モック、ライフサイクルフックを扱う Vitest のテスト実践スキルです。テストスイートの実行と、非同期マッチャーでの `await` 使用を確認する検証基準も示します。
主な機能
- 01一般的なアサーションの参照
- 02非同期テストの書き方
- 03vi によるモック操作の例
- 04テストフックとメソッドの一覧
- 05テスト検証基準の定義
活用シーン
- 01Vitest テストのアサーション作成
- 02非同期関数と Promise のテスト
- 03テスト変更と非同期マッチャーの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ existential-birds/ beagle --skill vitest-testingインストール後、Claude Code で/vitest-testingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
CONFIG.mdMOCKING.mdPATTERNS.mdreferences/config.mdmocking.mdpatterns.md詳細
Vitest のベストプラクティス
クイックリファレンス
import { describe, it, expect, beforeEach, vi } from 'vitest'
describe('feature name', () => {
beforeEach(() => {
vi.clearAllMocks()
})
it('should do something specific', () => {
expect(actual).toBe(expected)
})
it.todo('planned test')
it.skip('temporarily disabled')
it.only('run only this during dev')
})
よく使うアサーション
// Equality
expect(value).toBe(42) // Strict (===)
expect(obj).toEqual({ a: 1 }) // Deep equality
expect(obj).toStrictEqual({ a: 1 }) // Strict deep (checks types)
// Truthiness
expect(value).toBeTruthy()
expect(value).toBeFalsy()
expect(value).toBeNull()
expect(value).toBeUndefined()
// Numbers
expect(0.1 + 0.2).toBeCloseTo(0.3)
expect(value).toBeGreaterThan(5)
// Strings/Arrays
expect(str).toMatch(/pattern/)
expect(str).toContain('substring')
expect(array).toContain(item)
expect(array).toHaveLength(3)
// Objects
expect(obj).toHaveProperty('key')
expect(obj).toHaveProperty('nested.key', 'value')
expect(obj).toMatchObject({ subset: 'of properties' })
// Exceptions
expect(() => fn()).toThrow()
expect(() => fn()).toThrow('error message')
expect(() => fn()).toThrow(/pattern/)
非同期テスト
// Async/await (preferred)
it('fetches data', async () => {
const data = await fetchData()
expect(data).toEqual({ id: 1 })
})
// Promise matchers - ALWAYS await these
await expect(fetchData()).resolves.toEqual({ id: 1 })
await expect(fetchData()).rejects.toThrow('Error')
// Wrong - creates false positive
expect(promise).resolves.toBe(value) // Missing await!
モックのクイックリファレンス
const mockFn = vi.fn()
mockFn.mockReturnValue(42)
mockFn.mockResolvedValue({ data: 'value' })
expect(mockFn).toHaveBeenCalled()
expect(mockFn).toHaveBeenCalledWith('arg1', 'arg2')
expect(mockFn).toHaveBeenCalledTimes(2)
検証ゲート
テストを追加または変更するときは、次の手順を使用します。各手順には明確な合格条件があります。
- テストスイートを実行する — パッケージまたはワークスペースのルートから、CI で使われるのと同じコマンドを実行します(
package.jsonのスクリプトを確認してください。多くの場合、vitest run、pnpm test、またはnpm testです)。**合格条件:**終了コードが 0 で、レポートに失敗したテストが 0 件と表示されること。 - 非同期マッチャー — **合格条件:**すべての
expect(…).resolvesとexpect(…).rejectsの前にawaitがあること(await expect(...))。非同期テストを参照してください。resolvesまたはrejectsがawaitなしで記述されている行があると、このゲートは不合格になります。
追加ドキュメント
- モック:モジュールのモック、スパイ、クリーンアップについては、references/mocking.md を参照してください
- 設定:vitest.config、セットアップファイル、カバレッジについては、references/config.md を参照してください
- パターン:タイマー、スナップショット、アンチパターンについては、references/patterns.md を参照してください
テストメソッドのクイックリファレンス
| メソッド | 目的 |
|---|---|
it() / test() | テストを定義する |
describe() | テストをグループ化する |
beforeEach() / afterEach() | テストごとのフック |
beforeAll() / afterAll() | スイートごとのフック |
.skip | テスト/スイートをスキップする |
.only | これだけを実行する |
.todo | プレースホルダー |
.concurrent | 並列実行 |
.each([...]) | パラメーター化されたテスト |
コメント
Markdown 対応