Vitestは、Vue.jsやViteを使用したプロジェクトのためのテストランナーで、非常に高速で使いやすいテスト環境を提供します。しかし、テストを実行する際に「ReferenceError: document is not defined」というエラーが発生することがあります。このエラーは、主にブラウザ環境でのみ利用可能なdocument
オブジェクトにアクセスしようとしたときに発生します。
本記事では、このエラーの原因とその対処法について詳しく解説します。
1. ReferenceError: document is not definedとは?
ReferenceError: document is not defined
というエラーは、Node.js環境で実行されるテストコードが、ブラウザ環境でのみ存在するdocument
オブジェクトにアクセスしようとしたときに発生します。
Node.jsはサーバーサイドのJavaScript環境であり、ブラウザのDOM(Document Object Model)にアクセスすることはできません。このため、テストコードがDOMに依存している場合、エラーが発生します。
エラーの例
以下は、document
オブジェクトにアクセスしようとした際に発生するエラーの例です。
test('should access document', () => {
const element = document.createElement('div');
expect(element).toBeDefined();
});
このコードをVitestで実行すると、ReferenceError: document is not defined
というエラーが発生します。
2. エラーの原因
1. Node.js環境でのテスト実行
VitestはNode.js環境で動作するため、ブラウザのAPI(document
やwindow
など)にはアクセスできません。これが、document
が未定義である主な原因です。特に、VueコンポーネントのテストやDOM操作を行う場合、このエラーが発生しやすくなります。
2. テスト環境の設定不足
Vitestの設定が不十分な場合、DOM環境をエミュレートするためのライブラリが正しく読み込まれず、document
オブジェクトが未定義のままになります。特に、JSDOMなどのライブラリを使用していない場合、DOM関連の操作ができません。
3. 対処法
1. JSDOMを使用する
document
オブジェクトにアクセスするための最も一般的な解決策は、JSDOMを使用してテスト環境を設定することです。JSDOMは、Node.js環境でDOMをエミュレートするライブラリで、ブラウザのAPIを模倣します。
JSDOMのインストール
まず、JSDOMをプロジェクトにインストールします。
npm install --save-dev jsdom
Vitestの設定
次に、Vitestの設定ファイル(vitest.config.js
など)にJSDOMを追加します。
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
environment: 'jsdom', // JSDOM環境を指定
},
});
この設定を行うことで、テスト実行時にdocument
オブジェクトが定義され、エラーが解消されます。
2. テストコードの修正
テストコードを修正して、document
オブジェクトに依存しないようにすることも一つの方法です。例えば、DOM操作を行う部分をモックすることで、テストを実行できるようにします。
test('should mock document', () => {
const mockCreateElement = jest.fn().mockReturnValue({}); // モック関数を作成
global.document = { createElement: mockCreateElement }; // documentをモック
const element = document.createElement('div');
expect(mockCreateElement).toHaveBeenCalled(); // モック関数が呼ばれたことを確認
});
このように、document
をモックすることで、実際のDOMに依存せずにテストを実行できます。
3. テスト環境の確認
Vitestの設定が正しく行われているかを確認することも重要です。特に、environment
オプションがjsdom
に設定されているかを確認します。設定が正しくない場合、DOM関連の操作ができず、エラーが発生します。
// vitest.config.js
export default defineConfig({
test: {
environment: 'jsdom', // 確認ポイント
},
});
4. まとめ
Vitestで「ReferenceError: document is not defined」というエラーが発生する原因は、主にNode.js環境でdocument
オブジェクトにアクセスしようとすることにあります。このエラーを解決するためには、JSDOMを使用してテスト環境を設定することが最も効果的です。また、テストコードを修正してdocument
に依存しないようにすることも有効です。
これらの対処法を実施することで、Vitestを使用したテストがスムーズに行えるようになるでしょう。