Skip to content
Grok

In-Source Testing

Vitest มีวิธีการรันเทสต์ภายในโค้ดต้นฉบับของคุณควบคู่ไปกับการใช้งานจริง คล้ายกับ module tests ของ Rust

วิธีนี้ทำให้เทสต์สามารถใช้ closure เดียวกันกับการใช้งานจริง และสามารถทดสอบสถานะส่วนตัวได้โดยไม่ต้องเปิดเผย (export) นอกจากนี้ยังช่วยให้วงจรการพัฒนาและรับผลตอบกลับรวดเร็วขึ้น

WARNING

คู่มือนี้อธิบายวิธีเขียนเทสต์ภายในโค้ดต้นฉบับของคุณ หากคุณต้องการเขียนเทสต์ในไฟล์เทสต์แยกต่างหาก โปรดดูที่คู่มือ "Writing Tests"

การตั้งค่า

เพื่อเริ่มต้น ให้วางบล็อก if (import.meta.vitest) ไว้ที่ท้ายไฟล์ต้นฉบับของคุณและเขียนเทสต์บางส่วนไว้ข้างใน ตัวอย่างเช่น:

ts
// การใช้งานจริง
export function add(...args: number[]) {
  return args.reduce((a, b) => a + b, 0);
}

// เทสต์ในโค้ดต้นฉบับ
if (import.meta.vitest) {
  const { it, expect } = import.meta.vitest;
  it("add", () => {
    expect(add()).toBe(0);
    expect(add(1)).toBe(1);
    expect(add(1, 2, 3)).toBe(6);
  });
}

อัปเดตการตั้งค่า includeSource สำหรับ Vitest เพื่อดึงไฟล์ภายใต้ src/:

ts
import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    includeSource: ["src/**/*.{js,ts}"],
  },
});

จากนั้นคุณสามารถเริ่มทำการทดสอบได้!

bash
$ npx vitest

การ Build สำหรับ Production

สำหรับการ build ในโหมด production คุณจำเป็นต้องตั้งค่าตัวเลือก define ในไฟล์ config ของคุณ เพื่อให้ bundler ทำการกำจัดโค้ดที่ไม่ใช้ ตัวอย่างเช่น ใน Vite

ts
/// <reference types="vitest/config" />

import { defineConfig } from "vite";

export default defineConfig({
  test: {
    includeSource: ["src/**/*.{js,ts}"],
  },
  define: {
    "import.meta.vitest": "undefined",
  },
});

Bundlers อื่นๆ

TypeScript

เพื่อให้ TypeScript รองรับ import.meta.vitest ให้เพิ่ม vitest/importMeta ลงใน tsconfig.json ของคุณ:

json
{
	"compilerOptions": {
		"types": ["vitest/importMeta"]
	}
}

ดูตัวอย่างเต็มได้ที่ examples/in-source-test

หมายเหตุ

คุณลักษณะนี้จะเป็นประโยชน์สำหรับ:

  • การทดสอบหน่วยสำหรับฟังก์ชันหรือยูทิลิตี้ขนาดเล็ก
  • การทำต้นแบบ (Prototyping)
  • การตรวจสอบแบบ Inline

แนะนำให้ใช้ไฟล์ทดสอบแยกต่างหากสำหรับการทดสอบที่ซับซ้อนมากขึ้น เช่น คอมโพเนนต์หรือการทดสอบ E2E