嚴格測試協議。強制執行「如果沒測試,就不算完成」原則。
觸發時機:
「如果沒測試,就不算完成。」
# 跑相關測試檔案,確認當前狀態
npm run test <相關檔案>
RED → 先寫失敗的測試
GREEN → 寫最少代碼讓測試通過
REFACTOR → 優化代碼,保持測試通過
# 跑完整測試套件
npm test
vi.mock 模擬 APIsrc/**/__tests__/*.test.ts// 範例
import { describe, it, expect, vi } from "vitest";
describe("功能名稱", () => {
it("應該正確處理某情況", () => {
// Arrange
const input = "test";
// Act
const result = myFunction(input);
// Assert
expect(result).toBe("expected");
});
});
api/ 目錄)node-mocks-http 模擬 Request/Responseapi/**/__tests__/*.test.tstests/e2e/*.spec.tsnpm run typecheck)npm test)describe("模組/組件名稱", () => {
describe("功能分類", () => {
it("應該 [預期行為] 當 [條件]", () => {
// ...
});
});
});
// 範例
describe("useComments", () => {
describe("toggleLike", () => {
it("應該正確切換按讚狀態當用戶點擊", () => {
// ...
});
it("應該回滾狀態當 API 失敗", () => {
// ...
});
});
});
vi.mock("../lib/supabase", () => ({
supabase: {
from: vi.fn(() => ({
select: vi.fn(() => ({
eq: vi.fn(() => Promise.resolve({ data: [], error: null })),
})),
})),
},
}));
vi.mock("../hooks/useAuth", () => ({
useAuth: () => ({
user: { id: "test-user" },
isLoggedIn: true,
}),
}));
it("應該處理異步操作", async () => {
const { result } = renderHook(() => useMyHook());
await act(async () => {
await result.current.asyncAction();
});
expect(result.current.state).toBe("expected");
});
it("應該正確處理錯誤", async () => {
// Mock API 返回錯誤
vi.mocked(fetch).mockRejectedValueOnce(new Error("Network error"));
const { result } = renderHook(() => useMyHook());
await act(async () => {
await result.current.action();
});
expect(result.current.error).toBe("Network error");
});
waitFor 等待異步更新vi.clearAllMocks() 在 beforeEach# 執行所有測試
npm test
# 執行單一檔案
npx vitest run src/path/to/file.test.ts
# 監視模式
npm run test:watch
# 查看覆蓋率
npx vitest run --coverage
# 只跑符合名稱的測試
npx vitest run -t "測試名稱關鍵字"
| 階段 | 整合 Skill | 說明 |
|---|---|---|
| 測試前 | /read-before-edit |
先讀懂現有測試 |
| 寫測試 | /code-validator |
確保測試代碼品質 |
| 測試失敗 | /type-checker |
修復類型問題 |
| 提交前 | /pre-commit-validator |
確保所有測試通過 |
┌─────────────────────────────────────────────────────────────────┐
│ │
│ 🧪 沒有測試的代碼 = 不存在的代碼 │
│ │
│ ✅ 測試通過 ≠ 代碼正確(但至少有基本保障) │
│ │
│ 🔄 測試失敗 → 修復代碼,不是刪除測試 │
│ │
└─────────────────────────────────────────────────────────────────┘