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 おき.
PDF Gratis: Cheatsheet Claude Code dalam 5 Menit
Cukup masukkan emailmu dan kami akan langsung mengirim cheatsheet PDF A4 satu halaman.
Kami menjaga data pribadimu dengan aman dan tidak pernah mengirim spam.
Tentang Penulis
Masa
Engineer yang aktif menggunakan Claude Code. Mengelola claudecode-lab.com, media teknologi 10 bahasa dengan lebih dari 2.000 halaman.
Artikel Terkait
Agent Harness Aman untuk Claude Code dan Codex: Permission, Verifikasi, dan Rollback
Rancang Agent Harness praktis untuk Claude Code dan Codex dengan policy, plan, verification, dan recovery layer.
10 Pola Subagent yang Ampuh untuk Claude Code
Kuasai fitur subagent Claude Code dengan 10 pola praktis. Pelajari cara menggunakan pemrosesan paralel, spesialisasi, dan isolasi konteks.
Pengantar Claude Code Agent SDK — Bangun Agen Otonom dengan Cepat
Pelajari cara membangun agen AI otonom dengan Claude Code Agent SDK. Mencakup setup, definisi tool, dan eksekusi multi-langkah dengan contoh kode praktis.