コンテンツへスキップ

インソーステスト

Vitest は、Rust のモジュールテスト と同様に、ソースコード内で実装をテストする手法も提供しています。

これにより、テストは実装と同じクロージャを共有し、エクスポートしなくてもプライベート状態に対してテストを行うことができます。また、開発のためのより密接なフィードバックループももたらします。

セットアップ

開始するには、ソースファイルの最後に if (import.meta.vitest) ブロックを置き、その中にテストを記述します。例:

ts
// src/index.ts

// the implementation
export function add(...args: number[]) {
  return args.reduce((a, b) => a + b, 0)
}

// in-source test suites
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)
  })
}

Vitest の includeSource 構成を更新して src/ 以下のファイルをすべて含めます。

ts
// vite.config.ts
/// <reference types="vitest" />
import { defineConfig } from 'vite'

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

これでテストを開始できます!

bash
$ npx vitest

本番ビルド

本番ビルドでは、構成ファイルに define オプションを設定して、バンダーがデッドコードを削除できるようにする必要があります。Vite の場合、例を次に示します。

ts
// vite.config.ts
/// <reference types="vitest" />
import { defineConfig } from 'vite'

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

その他のバンダー

unbuild
ts
// build.config.ts
import { defineBuildConfig } from 'unbuild'

export default defineBuildConfig({
  replace: { 
    'import.meta.vitest': 'undefined', 
  }, 
  // other options
})

さらに詳しく: unbuild

Rollup
ts
// rollup.config.js
import replace from '@rollup/plugin-replace'

export default {
  plugins: [
    replace({ 
      'import.meta.vitest': 'undefined', 
    }) 
  ],
  // other options
}

さらに詳しく: Rollup

TypeScript

import.meta.vitest に対する TypeScript サポートを取得するには、tsconfig.jsonvitest/importMeta を追加します。

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

完全な例については、test/import-meta を参照してください。

注意事項

この機能は以下に役立ちます。

  • 小規模な機能やユーティリティに対する単体テスト
  • プロトタイピング
  • インラインアサーション

コンポーネントや E2E テストなどのより複雑なテストには、代わりに別個のテストファイルを使用することをお勧めします

MIT ライセンスの下でリリースされています。