ワンクリックで
tdd
TDD (Test-Driven Development) 最佳實踐指南,搭配 Vitest + React Testing Library。當需要撰寫測試、實踐 Red-Green-Refactor、設計測試結構時使用。應在開發新功能時主動套用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
TDD (Test-Driven Development) 最佳實踐指南,搭配 Vitest + React Testing Library。當需要撰寫測試、實踐 Red-Green-Refactor、設計測試結構時使用。應在開發新功能時主動套用。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
cubejs (Rubik's Cube solver, Kociemba two-phase) 使用指南。當需要實作魔術方塊自動解法、狀態字串序列化、或 scramble 產生時使用。
msw-fetch-mock 套件使用指南(搭配 MSW v2 + Vitest)。當需要 mock HTTP 請求、測試 fetch 呼叫、驗證 API 互動時使用。
React 19 最佳實踐指南。當需要撰寫 React 元件、使用 Hooks、處理狀態管理、或搭配 TypeScript/Vite 開發時使用。
React Three Fiber (R3F) + Three.js + drei 最佳實踐。當需要建立 3D 場景、處理相機/光照、互動事件、動畫、效能優化時使用。
Test Doubles 最佳實踐指南(Vitest + TypeScript)。當需要選擇 Mock/Stub/Fake/Spy/Dummy、或討論測試隔離策略時使用。
Vite 6/7 最佳實踐指南。當需要初始化 Vite 專案、設定 plugin、配置 build、除錯 HMR、path alias 或整合 React/TS/Vitest 時使用。
| name | tdd |
| description | TDD (Test-Driven Development) 最佳實踐指南,搭配 Vitest + React Testing Library。當需要撰寫測試、實踐 Red-Green-Refactor、設計測試結構時使用。應在開發新功能時主動套用。 |
鐵律:
pnpm add -D vitest @vitest/ui jsdom \
@testing-library/react @testing-library/user-event \
@testing-library/jest-dom
/// <reference types="vitest" />
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',
coverage: { reporter: ['text', 'html'] },
},
})
src/test/setup.ts:
import '@testing-library/jest-dom/vitest'
import { cleanup } from '@testing-library/react'
import { afterEach } from 'vitest'
afterEach(() => cleanup())
foo.ts → foo.test.ts 同資料夾__tests__/foo.test.tsimport { describe, it, expect, beforeEach, vi } from 'vitest'
describe('Cube', () => {
let cube: Cube
beforeEach(() => { cube = new Cube() })
it('rotates U face clockwise', () => {
// Arrange
cube.apply('U')
// Act
const top = cube.getFace('U')
// Assert
expect(top).toEqual(Array(9).fill('U'))
})
})
import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
it('increments on click', async () => {
const user = userEvent.setup()
render(<Counter />)
await user.click(screen.getByRole('button', { name: /add/i }))
expect(screen.getByText('1')).toBeInTheDocument()
})
Query 優先順序:getByRole > getByLabelText > getByPlaceholderText > getByText > getByTestId(最後手段)。
E2E (Playwright) ← 少量、關鍵流程
Integration (RTL) ← 元件 + store
Unit (Vitest pure functions) ← 大量、邏輯
本專案分層建議:
✅ 測行為:給定輸入 → 期待輸出/副作用 ✅ 邊界條件、錯誤處理、public API ❌ 不測實作細節:私有函式、內部 state 欄位 ❌ 不測第三方套件本身 ❌ 不測 trivial getter/setter
見 test-doubles skill。原則:能不 mock 就不 mock,優先 Fake > Stub > Mock。
// 1. Red
it('U move rotates top face clockwise', () => {
const cube = new Cube()
cube.apply('U')
expect(cube.facelets.slice(0, 9)).toBe('UUUUUUUUU')
expect(cube.facelets.slice(9, 12)).toBe('FFF') // R top row = F
})
// 2. Green (最小實作)
class Cube {
facelets = 'UUUUUUUUU RRR... '
apply(move: string) {
if (move === 'U') { /* 實作 U */ }
}
}
// 3. Refactor:抽 rotateFace 工具、查表驅動 6 面
pnpm test 全綠才 commit