ソース内テスト
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
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
includeSource: ['src/**/*.{js,ts}'],
},
});
これでテストを実行できます。
プロダクションビルド
プロダクションビルドでは、設定ファイルで define
オプションを設定し、バンドラーに不要なコードの削除(デッドコードエリミネーション)を実行させる必要があります。たとえば、Vite では次のようになります。
diff
// vite.config.ts
import { defineConfig } from 'vitest/config'
export default defineConfig({
+ define: {
+ 'import.meta.vitest': 'undefined',
+ },
test: {
includeSource: ['src/**/*.{js,ts}']
},
})
その他のバンドラー
unbuild
diff
// build.config.ts
import { defineBuildConfig } from 'unbuild'
export default defineBuildConfig({
+ replace: {
+ 'import.meta.vitest': 'undefined',
+ },
// その他のオプション
})
詳細については: unbuild
rollup
diff
// rollup.config.js
+ import replace from '@rollup/plugin-replace'
export default {
plugins: [
+ replace({
+ 'import.meta.vitest': 'undefined',
+ })
],
// その他のオプション
}
詳細については: rollup
TypeScript
import.meta.vitest
の TypeScript サポートを有効にするには、tsconfig.json
に vitest/importMeta
を追加します。
diff
// tsconfig.json
{
"compilerOptions": {
"types": [
+ "vitest/importMeta"
]
}
}
完全な例は、test/import-meta
を参照してください。
注意点
この機能は、以下のような場合に特に役立ちます。
- 小規模な関数やユーティリティのユニットテスト
- プロトタイピング
- インラインアサーション
コンポーネントテストや E2E テストなど、より複雑なテストを行う場合は、個別のテストファイルを使用することを推奨します。