できない.dev

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 definedwindow is not defined も同様)は、Vitest の既定テスト環境が Node.js で、ブラウザの DOM API を持たないために出る。

DOM を使うコンポーネントテストでは、jsdomhappy-dom のブラウザ風環境へ切り替える必要がある。

test.environmentjsdom にすれば document などが使えるようになる(公式: environment)。

よくある原因

  1. 既定の environmentnode で DOM が無い。
  2. React / Vue などのテストで documentwindow を参照している。
  3. 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 jsdom

happy-dom を使う場合は同様に npm i -D happy-dom で追加する。

テスト対象が DOM を触らないユーティリティだけなら environmentnode のままでよく、画面描画を伴うテストだけ jsdom にすると起動コストを抑えられる。

この記事は役立ちましたか?