ソース内テスト
Vitest は、Rust のモジュールテストと同様に、実装コードと同じファイル内でテストを実行する方法を提供します。
これにより、テストは実装と同じスコープを共有し、エクスポートされていないプライベートな変数もテストできます。また、開発におけるフィードバックループをより緊密にすることができます。
セットアップ
ソースファイルの一番下に if (import.meta.vitest)
ブロックを配置し、その中にテストを記述します。以下に例を示します。
ts
// src/index.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);
});
}
Vitest の includeSource
設定を更新して、src/
ディレクトリ以下のファイルをテスト対象に含めます。
ts
// vite.config.ts
/// <reference types="vitest" />
import { defineConfig } from 'vite';
export default defineConfig({
test: {
includeSource: ['src/**/*.{js,ts}'],
},
});
これでテストを実行できます。
プロダクションビルド
プロダクションビルドでは、設定ファイルで 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.json
に vitest/importMeta
を追加します。
json
// tsconfig.json
{
"compilerOptions": {
"types": [
"vitest/importMeta"
]
}
}
完全な例は、test/import-meta
を参照してください。
注意点
この機能は、以下のような場合に特に役立ちます。
- 小規模な関数やユーティリティのユニットテスト
- プロトタイピング
- インラインアサーション
コンポーネントテストや E2E テストなど、より複雑なテストを行う場合は、個別のテストファイルを使用することを推奨します。