Jest で「ReferenceError: document is not defined」が解決できない
Jest 27 以降は既定の testEnvironment が node で DOM が無い。
ブラウザ向けテストは testEnvironment を jsdom にし、Jest 28 以降は jest-environment-jsdom を別途インストールする。
公開:
要約
Jest 27 以降、既定の testEnvironment は "node" になり、document や window が存在しない。
React コンポーネントや DOM 操作のテストで document を触ると「ReferenceError: document is not defined」になる。
解決は testEnvironment を jsdom に切り替えること。
さらに Jest 28 以降は jsdom 環境が本体から分離されたため、jest-environment-jsdom を別途インストールする必要がある。
よくある原因
- 既定が node 環境: Jest 27 で既定が jsdom から node へ変わった。
- jsdom パッケージ未導入: Jest 28 で jsdom 環境は別パッケージに分離された。
- ファイル単位の指定漏れ: 一部のテストだけ 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 のままにしておくと起動が速い。