# React/Jest/react-testing-library環境構築 まずはViteの環境を作る ただしここは課題2ですでにプロジェクトがあるので不要 ライブラリインストールからやる ``` ❯ npm create vite@latest Need to install the following packages: create-vite@5.2.0 Ok to proceed? (y) y ✔ Project name: … react-jest-sample ✔ Select a framework: › React ✔ Select a variant: › JavaScript Scaffolding project in /home/watanabejin/react-jest-sample... Done. Now run: cd react-jest-sample npm install npm run dev ``` jestとreact-testing-libraryをインストール ``` npm install --save-dev jest @testing-library/react @testing-library/jest-dom @testing-library/user-event babel-jest @babel/preset-env @babel/preset-react ``` ## Jestの確認 jest.config.mjsというファイルを作成する ``` export default { testEnvironment: "jsdom", moduleNameMapper: { "\\.(css|less)$": "identity-obj-proxy", }, setupFilesAfterEnv: ["./jest.setup.js"], }; ``` jest.setup.jsを作る これはテストが走る際に実行されるグローバルな設定を書いておくスクリプト ``` import "@testing-library/jest-dom"; // dotenvの設定 require("dotenv").config(); ``` ここでテスト環境でも.envの環境変数を使えるようにしたいのでdotenvというライブラリを使っている。これもインストールする ``` npm i dotenv ``` .eslintrc.cjsを修正する(VSCodeで利用していない変数がエラーになるを防ぐ) ``` module.exports = { root: true, env: { browser: true, es2020: true }, extends: [ 'eslint:recommended', 'plugin:react/recommended', 'plugin:react/jsx-runtime', 'plugin:react-hooks/recommended', ], ignorePatterns: ['dist', '.eslintrc.cjs'], parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, settings: { react: { version: '18.2' } }, plugins: ['react-refresh'], rules: { 'react/jsx-no-target-blank': 'off', 'react-refresh/only-export-components': [ 'warn', { allowConstantExport: true }, ], "no-unused-vars": false }, } ``` まずは関数のテストがjestで可能かをサンプルテストを作成して確認する src/__tests__/sample.spec.jsを作成する 以下のテストを書く(trueがtrueであることを確かめるテスト) ``` describe("Sample Test", () => { it("should return true", () => { expect(true).toBe(true); }); }); ``` 次にnpm run testでテストが実行できるようにする ``` npm install --save-dev jest-environment-jsdom @babel/core @babel/preset-env ``` .babelrcというファイルを作る ``` { "presets": [ "@babel/preset-env", ["@babel/preset-react", { "runtime": "automatic" }] ] } ``` コマンドからテストを実行する ``` npm run test ``` **追記:package.jsonに下記を追加する** ``` "scripts": { "test": "jest", } ``` テストが実行されて成功したらOK ## コンポーネントのテストをする 実際にフロント側で正しく表示されているかをテストするのにreact-testing-libraryを利用する テスト用にApp.jsxを変更する ``` import React from "react"; function App() { return ( <> <h1 data-testid="title">Hello Jest</h1> </> ); } export default App; ``` ここでh1が「Hello Jest」になっていることをテストしてreact-testing-libraryが正しく導入できていることを確認する titleタグにdata-testidをつけた。これはテスト時だけに振られるIDであり、これを参照することでテストではh1を画面からdatat-testidを使って特定する src/__tests__/componenteSample.spec.jsxを作成する ``` import App from "../App"; import React from "react"; import '@testing-library/jest-dom' import { render, screen } from "@testing-library/react"; describe("Title Test", () => { it("タイトルがHello Jestであること", () => { // testId(title)を指定して取得 render(<App />); const title = screen.getByTestId("title"); expect(title).toHaveTextContent("Hello Jest"); }); }); ``` いかのようにすべてのテストが通ればOK ![image](https://hackmd.io/_uploads/H1jir49ia.png) **追記:Jestのバージョン27からデフォルトのテスト環境に変化があったようです。エラーが出る場合は下記を参考に修正してください。** 「The error below may be caused by using the wrong test environment」が出た時の対応 https://qiita.com/ryosuketter/items/ff2c6085c06d9cd343d5 「Cannot find module '@testing-library/jest-dom/extend-expect' from 'src/tests/componenteSample.spec.js'」が出た時の対応 https://stackoverflow.com/questions/77328459/cannot-find-module-testing-library-jest-dom-extend-expect-from-jest-setup-js