🌊

自分の作ったChrome拡張にテストを組み込む(3) React-Testing-Libraryインストール編

2022/09/07に公開

JestとReact-Testing-Libraryを使って単体テストをやりたい

https://zenn.dev/satoshie/articles/cbbe6a60cf2570

このメモの続きです。

対象レポジトリ

https://github.com/satoshi-nishinaka/chrome-extension-study

React-Testing-Libraryをインストールする

https://testing-library.com/

シンプルで完全なテストユーティリティで、優れたテストプラクティスを促進します。

そもそも、フロントエンドの知識経験が少ないので業務で利用しているフロントエンドのテストを理解し、書けるようになりたいという目的があります。
今回JestとReact-Testing-Libraryを選択したのは業務で利用しているということが大きいです。

React-Testing-LibraryではAtomicDesignの思想を元に小さくしたコンポーネントをテストできるという点で興味深いテストライブラリです。(個人の感想です)

脱線しましたが早速インストールしていこうと思います。

$ npm install --save-dev @testing-library/react

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: short-cut-extension@1.3.2
npm ERR! Found: react@17.0.2
npm ERR! node_modules/react
npm ERR!   react@"^17.0.1" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^18.0.0" from @testing-library/react@13.3.0
npm ERR! node_modules/@testing-library/react
npm ERR!   dev @testing-library/react@"*" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
npm ERR!
npm ERR! See /Users/satoshie/.npm/eresolve-report.txt for a full report.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/satoshie/.npm/_logs/2022-09-01T09_33_00_921Z-debug-0.log

また依存関係ィィ…。

2022年9月時点でReactの最新は18ではありますが、React@17のバージョンで実装しているので、ひとまずReact@17に対応しているReact-Testing-Libraryの最新である12でインストールします。

$ npm install --save-dev @testing-library/react@^12

added 11 packages, and audited 743 packages in 3s

74 packages are looking for funding
  run `npm fund` for details

3 high severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

Exampleを元にテストを追加する

サンプルがここに貼るには大きいのでリンク先のページを参考に仮のテストを作ります。

最初のReactコンポーネントのテストは多分ここらへんを見るのが良さそう。

とはいえ、オリジナルのコンポーネントを作成する前にまずはHTMLを使ったテストが動くようにしたい。

まずはテスト用のディレクトリを追加します。

$ tree -d src
src
├── Component
├── Container
├── FunctionalButton
├── Functions
│   └── __tests__
├── Section
│   └── ShortCutLinks
└── scss

$ mkdir -p src/Component/__tests__

テストで必要なライブラリも追加。

user-eventのインストール
$ npm install --save-dev @testing-library/user-event

added 1 package, and audited 744 packages in 2s

74 packages are looking for funding
  run `npm fund` for details

3 high severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
jest-domのインストール
$ npm install --save-dev @testing-library/jest-dom

added 5 packages, and audited 749 packages in 3s

74 packages are looking for funding
  run `npm fund` for details

3 high severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

jestのサイトのコードでまずテストしてみる。

src/Component/__tests__/LinkButton.tsx
/**
 * @jest-environment jsdom
 */

import * as React from 'react';

test('use jsdom in this test file', () => {
  const element = document.createElement('div');
  expect(element).not.toBeNull();
});

テスト実行
$ npm run test

> short-cut-extension@1.3.2 test
> npx jest --config src/jest.config.ts

 FAIL  src/Component/__tests__/LinkButton.tsx
  ● Test suite failed to run

    ● Validation Error:

      Test environment jest-environment-jsdom cannot be found. Make sure the testEnvironment configuration option points to an existing node module.

      Configuration Documentation:
      https://jestjs.io/docs/configuration


    As of Jest 28 "jest-environment-jsdom" is no longer shipped by default, make sure to install it separately.


        Test environment jest-environment-jsdom cannot be found. Make sure the testEnvironment configuration option points to an existing node module.

        Configuration Documentation:
        https://jestjs.io/docs/configuration

      As of Jest 28 "jest-environment-jsdom" is no longer shipped by default, make sure to install it separately.

 PASS  src/Functions/__tests__/Unique.ts
  ✓ remove duplicate element (3 ms)
  ✓ remove duplicate elements
  ✓ remove duplicate elements (1 ms)

Test Suites: 1 failed, 1 passed, 2 total
Tests:       3 passed, 3 total
Snapshots:   0 total
Time:        2.757 s, estimated 3 s
Ran all test suites.

jest-environment-jsdom はまだインストールしていないのでインストールします。

jest-environment-jsdomのインストール
$ npm install --save-dev jest-environment-jsdom

では、今の状態でどうなるか、テストを実行します。

テスト実行
$ npm run test

> short-cut-extension@1.3.2 test
> npx jest --config src/jest.config.ts

 PASS  src/Functions/__tests__/Unique.ts
  ✓ remove duplicate element (2 ms)
  ✓ remove duplicate elements
  ✓ remove duplicate elements

 PASS  src/Component/__tests__/LinkButton.tsx
  ✓ use jsdom in this test file (2 ms)

Test Suites: 2 passed, 2 total
Tests:       4 passed, 4 total
Snapshots:   0 total
Time:        3.66 s
Ran all test suites.

テストが通るようになりました!

では自身で作成したコンポーネントのテストを書いていきましょう〜〜〜!
https://zenn.dev/satoshie/articles/2c593bb5f657f8

Discussion