できない.dev

Jest で「ReferenceError: document is not defined」が解決できない

Jest 27 以降は既定の testEnvironment が node で DOM が無い。
ブラウザ向けテストは testEnvironment を jsdom にし、Jest 28 以降は jest-environment-jsdom を別途インストールする。

公開:

要約

Jest 27 以降、既定の testEnvironment"node" になり、documentwindow が存在しない。

React コンポーネントや DOM 操作のテストで document を触ると「ReferenceError: document is not defined」になる。

解決は testEnvironment を jsdom に切り替えること。
さらに Jest 28 以降は jsdom 環境が本体から分離されたため、jest-environment-jsdom を別途インストールする必要がある。

よくある原因

  1. 既定が node 環境: Jest 27 で既定が jsdom から node へ変わった。
  2. jsdom パッケージ未導入: Jest 28 で jsdom 環境は別パッケージに分離された。
  3. ファイル単位の指定漏れ: 一部のテストだけ DOM が要るのにグローバル設定していない。

解決策

1. グローバルに jsdom を使う

npm i -D jest-environment-jsdom
// jest.config.js
module.exports = {
  testEnvironment: 'jsdom',
};

2. ファイル単位で環境を指定する

テストファイル先頭の docblock で切り替えられる。
DOM が要るテストだけ jsdom にできる。

/**
 * @jest-environment jsdom
 */
test('renders', () => {
  document.body.innerHTML = '<div id="app"></div>';
  expect(document.getElementById('app')).not.toBeNull();
});

指定できる値と挙動は 公式の testEnvironment 設定(新しいタブで開く) を参照する。
DOM 不要なテストは node のままにしておくと起動が速い。

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