Vitest で「document is not defined」が解決できない(jsdom 環境未設定)
Vitest の既定環境は node なので、document や window を触ると document is not defined になる。
test.environment を jsdom か happy-dom にすれば DOM API が使えるようになる。
#vitest#jsdom#environment
公開:
要約
document is not defined(window is not defined も同様)は、Vitest の既定テスト環境が Node.js で、ブラウザの DOM API を持たないために出る。
DOM を使うコンポーネントテストでは、jsdom か happy-dom のブラウザ風環境へ切り替える必要がある。
test.environment を jsdom にすれば document などが使えるようになる(公式: environment)。
よくある原因
- 既定の
environmentがnodeで DOM が無い。 - React / Vue などのテストで
documentやwindowを参照している。 jsdom(またはhappy-dom)が未インストール。
解決策
1. environment を jsdom にする
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: { environment: 'jsdom' },
});2. ファイル単位で切り替える
// @vitest-environment jsdomファイル先頭の docblock やコメントで、その file だけ別環境を指定できる。
3. 依存を入れる
npm i -D jsdomhappy-dom を使う場合は同様に npm i -D happy-dom で追加する。
テスト対象が DOM を触らないユーティリティだけなら environment は node のままでよく、画面描画を伴うテストだけ jsdom にすると起動コストを抑えられる。