こんにちは。kaoruです。
今回はcreate-react-appに最初から実装されているReact Testing Libraryでテスト実装してみます。
【前回】コンポーネントを細分化する (Wheather-app実装 4)
React Testing Libraryって?
create-react-appには最初からJest, React Testing Libraryというテスト実装に必要なライブラリが入っているのです。
概要は別記事を参照ください。

さぁ、やっていきましょうー。
React Testing Libraryでテスト実装
まずは動かしてみます
基本的には準備が揃っていて、ミニマムなテストファイルも用意されています。
以下コマンドでいきなりテスト実行もできます。
yarn start
最初にすべきこと
create-react-appのバージョンにも寄ると思うのですが、v3.4.1だとちょっと対応が必要でした。
Qiitaに(初!)投稿したので以下を参照ください。
【Qiita】CRA(v3.4.1)のReact Testing Libraryで最初に対処すること
テスト実装

テスト書いたぞ〜!
import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import App from './App';
test('renders learn react link', async () => {
render(<App />);
// screen.debug() //render後のコンポーネントをコンソール出力
// 画面上テキストのテスト
expect(screen.getByText('週間天気')).toBeInTheDocument();
// ボタン + "天気情報" 存在テスト
expect(screen.getByRole('button', {name: '天気情報'})).toBeInTheDocument();
// API結果表示領域のdisplay:none 確認
// (コンポーネント自体の検索はできないのでdata-testid使用
expect(screen.getByTestId('weatherDays')).toHaveStyle('display:none') //data-testidは非推奨.
// ボタン押下 API呼び出し
userEvent.click(screen.getByRole('button'))
// API取得の正常結果("Sun" ~ "Sat"テキストの一部)確認。デフォルト1000msなのでtimeout:3000ms設定
const result = await screen.findByText('Sun', undefined, {timeout: 3000});
expect(result).toBeTruthy()
// ("Sun" ~ "Sat"テキストの一部)確認
expect(screen.getByText('Mon')).toBeTruthy()
});
結果

所感
- React Testing LibraryはReactコンポーネントのテスト(再Render含む)
- あくまでも「ユーザ目線」のテストであり、コンポーネント内部のテストではない。
- つまり、ユーザの見えているボタンやテキストといった結果のテスト
- Reactコンポーネント内部をテストしたいならEnzymeを使うっぽい。
- イメージとしてはコンポーネント単位で使えるSelenium。
では、また〜。
コメント