Next.js 14 でJestを設定する方法
Next.js + Jest サンプルをもとに設定
Next.jsにJestのサンプルがあります。これを参考にしてJestの設定を行います。
上記のサンプルプロジェクトをローカルに作成する場合、以下を実行します。実行すると with-jest-app ディレクトリが作成されます。
npx create-next-app --example with-jest with-jest-app
サンプルではテストファイルは __tests__ ディレクトリ以下に置かれますが、今回は tests/jest ディレクトリに変更して以下のようなディレクトリ構成にします。 これはJest以外にテストツール等を追加するための対応です。 例えば、e2eテストを追加するとき、tests/e2e ディレクトリを作成して、その中にe2eテスト関係のファイルをまとめるケースです。
next-app -- (Next.js用プロジェクトディレクトリ) |- package.json |- tsconfig.json |- src --- app | |- jest.config.js |- jest.setup.js | |- tests --- jset --- spec --- app (src/app 以下にあるファイルのテストファイルを置く)
テスト設定の作業はサンプルを参考に以下を行います。
必要なパッケージのインストール
サンプルを参考に必要なパッケージをインストールします。
Jest関係は以下になります。
npm i -D jest jest-environment-jsdom @types/jest
Testing-library関係は以下になります。
npm i -D @testing-library/react @testing-library/jest-dom
jest.config.jsの作成
サンプルの jest.config.js に修正を加えます。 この例ではテストファイルを置くディレクトリを tests/jest/spec にしますので、その設定として testMatch を追加します。
const nextJest = require("next/jest");
const createJestConfig = nextJest({
// Provide the path to your Next.js app to load next.config.js and .env files in your test environment
dir: "./",
});
// Add any custom config to be passed to Jest
const customJestConfig = {
setupFilesAfterEnv: ["<rootDir>/jest.setup.js"],
testEnvironment: "jsdom",
testMatch: [
"**/tests/jest/spec/**/*.(spec|test).ts?(x)"
]
};
// createJestConfig is exported this way to ensure that next/jest can load the Next.js config which is async
module.exports = createJestConfig(customJestConfig);
jest.setup.jsの作成
jest.config.js はサンプルと同じにします。内容は以下のようになります。
// Learn more: https://github.com/testing-library/jest-dom import "@testing-library/jest-dom";
テスト用ディレクトリ作成と動作確認
テスト用ディレクトリを作成します。Next.jsプロジェクトのトップディレクトリで以下を実行します。
mdkir -p tests/jest/spect/app
次に動作確認用テストファイルを作成します。ファイルパスは以下になります。
tests/jest/spec/app/page.test.tsx
中身は以下になります。 これはトップページのある文字列が存在することを確認するテストです。 バージョンによっては文字列が異なるかもしれません。 そのときは src/app/page.tsx の中から適当な文字列を見つけて置き換えます。
import Home from '@/app/page'; import { render } from '@testing-library/react'; describe("Hom page test", () => { test("Sample test", async () => { const { findAllByText } = render(<Home />); expect(await findAllByText("Find in-depth information about Next.js features and API.")).toHaveLength(1); }); });
実行して以下のようになれば成功です。
$ npm run test > next-app@0.1.0 test > jest PASS tests/jest/spec/app/page.test.tsx Home Test ✓ Shanpshot test (59 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.862 s, estimated 1 s Ran all test suites.