VitestAdvanced Techniques dengan Claude Code
Pelajari tentang vitestadvanced techniques menggunakan Claude Code. Dilengkapi tips praktis dan contoh kode.
Vitestで高品質なtestスイートをpembangunan
Vitest Viteベース cepattestframework.Jest互換 API 加え、TypeScript ネイティブサポート、HMRdukungan pemantauanモード dll.、モダンなpengembangan体験 penyediaan.Claude Code kompleksなtestシナリオ コードgenerate 非常 優れてい.
高度なmock戦略
Claude Code modulmock 設計 依頼し.
> 外部APIclient mock 設計して。
> request・response 型チェック付き、errorケース juga 含めて。
import { describe, it, expect, vi, beforeEach } from "vitest";
import { UserService } from "./user-service";
import { ApiClient } from "./api-client";
// modulmock
vi.mock("./api-client", () => ({
ApiClient: vi.fn().mockImplementation(() => ({
get: vi.fn(),
post: vi.fn(),
put: vi.fn(),
delete: vi.fn(),
})),
}));
describe("UserService", () => {
let service: UserService;
let mockClient: ReturnType<typeof vi.mocked<ApiClient>>;
beforeEach(() => {
vi.clearAllMocks();
mockClient = new ApiClient() as any;
service = new UserService(mockClient);
});
it("penggunadaftar pengambilan", async () => {
const mockUsers = [
{ id: "1", name: "Alice", email: "[email protected]" },
{ id: "2", name: "Bob", email: "[email protected]" },
];
vi.mocked(mockClient.get).mockResolvedValue({ data: mockUsers });
const result = await service.getUsers();
expect(mockClient.get).toHaveBeenCalledWith("/users");
expect(result).toEqual(mockUsers);
});
it("APIerror時 カスタムexception スロー", async () => {
vi.mocked(mockClient.get).mockRejectedValue(
new Error("Network Error")
);
await expect(service.getUsers()).rejects.toThrow("pengguna pengambilan gagalしま");
});
});
parametertest(test.each)
同じロジック 複数 parameter verifikasi pola.
describe("validasifungsi", () => {
it.each([
{ input: "[email protected]", expected: true },
{ input: "[email protected]", expected: true },
{ input: "invalid-email", expected: false },
{ input: "@no-local.com", expected: false },
{ input: "no-domain@", expected: false },
{ input: "", expected: false },
])("isValidEmail($input) => $expected", ({ input, expected }) => {
expect(isValidEmail(input)).toBe(expected);
});
it.each`
password | minLength | hasUpper | hasNumber | expected
${"Abc12345"} | ${8} | ${true} | ${true} | ${true}
${"abc12345"} | ${8} | ${false} | ${true} | ${false}
${"short"} | ${8} | ${false} | ${false} | ${false}
${"NoNumbers"} | ${8} | ${true} | ${false} | ${false}
`(
"パスワード強度チェック: $password",
({ password, expected }) => {
expect(isStrongPassword(password)).toBe(expected);
}
);
});
pembuatan カスタムマッチャー
proyek固有 アサーション definisi bisa dilakukan.
// vitest.setup.ts
import { expect } from "vitest";
expect.extend({
toBeWithinRange(received: number, floor: number, ceiling: number) {
const pass = received >= floor && received <= ceiling;
return {
message: () =>
`expected ${received} to be within range ${floor} - ${ceiling}`,
pass,
};
},
toBeValidDate(received: string) {
const date = new Date(received);
const pass = !isNaN(date.getTime());
return {
message: () => `expected "${received}" to be a valid date string`,
pass,
};
},
toMatchApiResponse(received: unknown) {
const pass =
typeof received === "object" &&
received !== null &&
"data" in received &&
"meta" in received;
return {
message: () => `expected value to match API response shape`,
pass,
};
},
});
// 型definisi
declare module "vitest" {
interface Assertion<T = any> {
toBeWithinRange(floor: number, ceiling: number): void;
toBeValidDate(): void;
toMatchApiResponse(): void;
}
}
pemanfaatan スナップショットtest
komponenやデータstruktur スナップショットtest.
import { render } from "@testing-library/react";
describe("UserProfile", () => {
it("profilカード 正しくrenderingされる", () => {
const { container } = render(
<UserProfile
user={{
id: "1",
name: "testpengguna",
email: "[email protected]",
role: "admin",
}}
/>
);
expect(container).toMatchSnapshot();
});
it("インラインスナップショット APIresponse verifikasi", () => {
const response = transformUserResponse(rawData);
expect(response).toMatchInlineSnapshot(`
{
"displayName": "testpengguna",
"email": "[email protected]",
"isAdmin": true,
}
`);
});
});
optimasi testcoverage
// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
coverage: {
provider: "v8",
reporter: ["text", "json", "html", "lcov"],
include: ["src/**/*.{ts,tsx}"],
exclude: [
"src/**/*.d.ts",
"src/**/*.test.{ts,tsx}",
"src/**/*.stories.{ts,tsx}",
"src/types/**",
"src/**/index.ts",
],
thresholds: {
statements: 80,
branches: 75,
functions: 80,
lines: 80,
},
},
setupFiles: ["./vitest.setup.ts"],
environment: "jsdom",
globals: true,
},
});
pola 非同期test
タイマーやevent待機 dll.、非同期pemrosesan test手法.
describe("非同期pemrosesan test", () => {
it("デバウンスfungsi 正しく動作", async () => {
vi.useFakeTimers();
const fn = vi.fn();
const debounced = debounce(fn, 300);
debounced("a");
debounced("b");
debounced("c");
expect(fn).not.toHaveBeenCalled();
vi.advanceTimersByTime(300);
expect(fn).toHaveBeenCalledTimes(1);
expect(fn).toHaveBeenCalledWith("c");
vi.useRealTimers();
});
it("リトライロジック 正しく動作", async () => {
const fn = vi
.fn()
.mockRejectedValueOnce(new Error("1回目gagal"))
.mockRejectedValueOnce(new Error("2回目gagal"))
.mockResolvedValue("berhasil");
const result = await retry(fn, { maxAttempts: 3, delay: 100 });
expect(result).toBe("berhasil");
expect(fn).toHaveBeenCalledTimes(3);
});
});
Summary
Vitest cepatな実行速度 dan モダンなAPI より、testpengembangan 体験 大きく向上させ.Claude Code pemanfaatanすれば、mock設計、parametertest、カスタムマッチャー dll. 高度なtestpola juga 素早くimplementasidimungkinkan.
E2Etest implementasi Playwright E2Etest実践panduan 、APImock 詳細 MSW APImockpemanfaatanpanduan silakan lihat.Vitest公式dokumen juga konfirmasi おき.
Related Posts
Setup MCP Server Claude Code dan Use Case Praktis
Panduan lengkap tentang kemampuan MCP server Claude Code. Pelajari cara menghubungkan tool eksternal, mengonfigurasi server, dan contoh integrasi dunia nyata.
Menguasai Claude Code Hooks: Auto-Format, Auto-Test, dan Lainnya
Pelajari cara menyiapkan auto-formatting dan auto-testing dengan Claude Code hooks. Dilengkapi contoh konfigurasi praktis dan use case dunia nyata.
Panduan Lengkap Menulis CLAUDE.md: Best Practice untuk Konfigurasi Project
Panduan menyeluruh untuk menulis file CLAUDE.md yang efektif. Pelajari cara mengkomunikasikan tech stack, konvensi, dan struktur project untuk memaksimalkan kualitas output Claude Code.