目次
概要
今回のブログポストではVite
を使って生成したTypeScript
ベースのReact
プロジェクトにテスト環境を構築する方法について説明します。また、Jest
とReact Testing Library
を使ってテストコードを書く方法についても説明します。
ブログシリーズ
このブログポストはシリーズで制作されました。以下はVite
のシリーズリストです。
- [Vite] TypeScript ベースの React プロジェクトを始める
- [Vite] TypeScript ベース React プロジェクトへテスト環境を構築する
- [Vite] TypeScript ベース React プロジェクトに Prettier を追加する
- [Vite] TypeScript ベース React プロジェクトでに Stylelint(CSS-in-JS)を追加する
Jest のインストール
Jest
は Facebook によって作られたテストフレームワークで、React
プロジェクトで最もよく使われるテストフレームワークです。Jest
を使うとJavaScript
に対するテストコードを書いて実行することができます。
Vite
を使って生成したTypeScript
ベースReact
プロジェクトにJest
をインストールするには、次のコマンドを実行します。
npm i -D jest @types/jest ts-jest
# yarn add -D jest @types/jest ts-jest
jest
:Jest
をインストールします。@types/jest
:Jest
の型定義ファイルをインストールします。ts-jest
:TypeScript
を使ってJest
を実行できるようにサポートするパッケージです。
Testing Libarary のインストール
React Testing Library
はReact
コンポーネントをテストするためのライブラリです。React Testing Library
を使うとReact
コンポーネントのレンダリング結果を検証したり、イベントを発生させるなどのテストを書くことができます。
Vite
を使って生成したTypeScript
ベースReact
プロジェクトにReact Testing Library
をインストールするには、次のコマンドを実行します。
npm i -D jest-environment-jsdom @testing-library/react @testing-library/jest-dom @testing-library/user-event jest-svg-transformer identity-obj-proxy
# yarn add -D jest-environment-jsdom @testing-library/react @testing-library/jest-dom @testing-library/user-event jest-svg-transformer identity-obj-proxy
jest-environment-jsdom
:Jest
でjsdom
環境を使うためのパッケージです。@testing-library/react
:React Testing Library
をインストールします。@testing-library/jest-dom
:Jest
でReact Testing Library
を使うためのパッケージです。@testing-library/user-event
:React Testing Library
でイベントを発生させるためのパッケージです。jest-svg-transformer
:Jest
でSVG
ファイルを使えるようにサポートするパッケージです。identity-obj-proxy
:CSS Module
を使う場合、Jest
でCSS Module
を使えるようにサポートするパッケージです。
Jest の基本設定
Jest
を使ってTypeScript
ベースReact
プロジェクトをテストするためには、Jest
を設定する必要があります。次のコマンドを実行して、ルートディレクトリで次のコマンドを実行してJest
の設定ファイルを作成します。
npx ts-jest config:init
# yarn ts-jest config:init
すると、ルートディレクトリにJest
の設定ファイルであるjest.config.js
ファイルが作成されることを確認できます。ファイルを開くと次のような内容が確認できます。
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
};
Vite
を使って生成したプロジェクトはデフォルトでES Modules
がモジュールシステムになっているため、module.export
(CommonJS モジュールシステム)をexport default
(ES Modules モジュールシステム)に変更する必要があります。
/** @type {import('ts-jest').JestConfigWithTsJest} */
export default {
preset: 'ts-jest',
testEnvironment: 'node',
};
またCommonJS
とES modules
の違いによりテストを実行する時に警告が発生する可能性があるため、これを防ぐためにtsconfig.json
ファイルを開いて次のようにesModuleInterop
オプションを設定します。
{
...
"compilerOptions": {
"esModuleInterop": true,
...
},
...
}
jest-environment-jsdom の設定
Jest
の基本テスト環境は次のようにnode
に設定されています。
/** @type {import('ts-jest').JestConfigWithTsJest} */
export default {
preset: 'ts-jest',
testEnvironment: 'node',
};
しかし、React
テストはDOM
環境で実行する必要があるため、次のようにjest-environment-jsdom
を使用するように設定する必要があります。
/** @type {import('ts-jest').JestConfigWithTsJest} */
export default {
preset: 'ts-jest',
testEnvironment: 'jest-environment-jsdom',
};
React Testing Library の設定
React Testing Library
を使ってReact
コンポーネントをテストするためには、React Testing Library
が提供するJest
用Matchers
を使用できるように設定する必要があります。
React Testing Library
が提供するJest
用Matchers
を設定するために、ルートディレクトリにjest.setup.ts
ファイルを作成し、次のように@testing-library/jest-dom
をimport
します。
import '@testing-library/jest-dom';
この後、jest.config.js
ファイルを再度開いて、次のようにsetupFilesAfterEnv
オプションを追加します。
/** @type {import('ts-jest').JestConfigWithTsJest} */
export default {
preset: 'ts-jest',
testEnvironment: 'node',
setupFilesAfterEnv: ['./jest.setup.ts'],
};
Jest
のテストファイルでReact Testing Library
のMatchers
のタイプを使用できるようにするために、tsconfig.json
ファイルを開いて、次のようにtypes
オプションを追加します。
{
...
"compilerOptions": {
"esModuleInterop": true,
"types": ["@testing-library/jest-dom"],
...
},
...
}
CSS と SVG ファイルの設定
CSS
ファイルとSVG
ファイルをJest
で使用できるようにするために、jest.config.js
ファイルに次のようにmoduleNameMapper
オプションを追加する必要があります。
/** @type {import('ts-jest').JestConfigWithTsJest} */
export default {
preset: 'ts-jest',
testEnvironment: 'jest-environment-jsdom',
setupFilesAfterEnv: ['./jest.setup.ts'],
moduleNameMapper: {
'^.+\\.svg$': 'jest-svg-transformer',
'\\.(css|less|scss)$': 'identity-obj-proxy',
},
};
Jest の実行
これでJest
とReact Testing Library
を使用してTypeScript
ベースのReact
プロジェクトをテストする準備が整いました。Jest
を使用してテストを実行できるようにするために、package.json
ファイルを開いて、次のように変更します。
"scripts": {
...
"test": "jest --watchAll",
"test:ci": "jest --ci"
},
修正が完了したら、次のコマンドを実行してJest
を実行します。
npm run test
# yarn test
すると、次のようにJest
が正常に実行されることが確認できます。
No tests found, exiting with code 0
Watch Usage
› Press f to run only failed tests.
› Press o to only run tests related to changed files.
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press q to quit watch mode.
› Press Enter to trigger a test run.
現在はテストコードを作成したないのでNo tests found
というメッセージが表示されることを確認できます。
テストコード作成
Jest
とReact Testing Library
を使用してTypeScript
ベースのReact
プロジェクトでテストコードを作成する方法について説明します。Jest
とReact Testing Library
を使用してテストコードを作成するために、src
ディレクトリにApp.test.tsx
ファイルを作成して次のように変更します。
import { render, screen } from '@testing-library/react';
import App from './App';
describe('<App />', () => {
it('Rendered well', async () => {
const { container } = render(<App />);
expect(screen.getByAltText('Vite logo')).toBeInTheDocument();
expect(screen.getByAltText('React logo')).toBeInTheDocument();
expect(screen.getByText('Vite + React')).toBeInTheDocument();
expect(container).toMatchSnapshot();
});
});
Jest
とReact Testing Library
を使用してVite
ロゴとReact
ロゴ、そしてVite + React
テキストが正しくレンダリングされるかどうかを確認するテストコードを作成しました。
作成したテストを実行するため、ターミナルで次のコマンドを実行してテストを実行します。
npm run test
# yarn test
すると、次のようにテスト結果が表示されることを確認できます。
PASS src/App.test.tsx
<App />
✓ Rendered well (20 ms)
› 1 snapshot written.
Snapshot Summary
› 1 snapshot written from 1 test suite.
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 1 written, 1 total
Time: 1.749 s, estimated 2 s
Ran all test suites.
Watch Usage
› Press f to run only failed tests.
› Press o to only run tests related to changed files.
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press q to quit watch mode.
› Press Enter to trigger a test run.
また、toMatchSnapshot
を使ってスナップショットテストを作成したため、__snapshots__
ディレクトリにスナップショットファイルが作成されることを確認できます。
完了
これでVite
を使って生成したTypeScript
ベースのReact
プロジェクトにテスト環境を構築する方法について説明しました。Jest
とReact Testing Library
を使用してテストコードを作成して、安全で安定したReact
プロジェクトを開発してください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。