テック技報最新号へ →
コード

TypeScript: テストのためだけに export しない → Vitest の In-source testing

内部関数をテストしたいだけで export すると、「他でも使われているかも」と読み手の負担が増える。Vitest の in-source testing なら、同じファイル内にテストを書け、本番ビルドからはテストコードが取り除かれる。

@zaru · 投稿 2026-06-29
#typescript#vitest#テスト

コード例

ts
// src/price.ts
function applyDiscount(price: number, rate: number) {   // export しない
  return Math.round(price * (1 - rate));
}

export function finalPrice(price: number) {
  return applyDiscount(price, 0.1);
}

if (import.meta.vitest) {
  const { it, expect } = import.meta.vitest;
  it("applyDiscount", () => {
    expect(applyDiscount(1000, 0.1)).toBe(900);
  });
}
ts
// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
  test: { includeSource: ["src/**/*.{js,ts}"] },
  define: { "import.meta.vitest": "undefined" }, // 本番ビルドでテストを除去
});
jsonc
// tsconfig.json
{ "compilerOptions": { "types": ["vitest/importMeta"] } }

注意点

  • 本番のバンドラ(Vite 以外を含む)でも import.meta.vitest を undefined に置き換える設定が必要。そうしないとテストコードが残る。
  • 大きなテストは従来どおり別ファイルの方が読みやすい。小さな純粋関数向け。

出典

X の元の投稿を開く