buttonのclickイベントをテストする方法【React Testing Library】

JavaScript
スポンサーリンク

Reactで、buttonをクリックしてonClickイベントを発生させるテストを実装します。

buttonをクリックするテストを実装

使用するメソッド

buttonをクリックするには、次の2つのメソッドが使えます。

  • userEvent.click(element)
  • fireEvent.click(element)

userEventの方が、よりブラウザに近い処理を行います。特別な理由がない限り、userEventを使用しましょう。詳細については、こちらのページを参照してください。

テスト対象のコード
import React, { useState } from 'react';
import './App.css';

export const Example = () => {
  const [count, setCount] = useState<number>(0);

  const handleClick = () => {
    setCount((prevCount) => prevCount + 1);
  };

  return (
    <div>
      <p>あなたは {count} 回クリックしました</p>
      <button onClick={handleClick}>クリック</button>
    </div>
  );
};

ボタンをクリックしたらcountの値がインクリメントされて、表示が更新されます。
今回は、初期状態とボタンをクリックした後で、それぞれ表示が更新されてるかテストしてみます。

テストコード
import React from 'react';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { Example } from './Example';

test('ボタンをクリックするとカウントされる', () => {
  render(<Example />);
  const button = screen.getByRole('button');
  expect(screen.getByText('あなたは 0 回クリックしました')).toBeInTheDocument();
  userEvent.click(button);
  expect(screen.getByText('あなたは 1 回クリックしました')).toBeInTheDocument();
});

初期状態での表示確認と、ボタンをクリックした後に表示が変わることをテストしています。
ひとつひとつ説明します。

const button = screen.getByRole('button');

クリックするHTMLElementのbuttonは、getByRole(‘button)で取得します。
テスト対象のコンポーネントはbuttonはひとつだけなので、ByRoleで大丈夫です。

expect(screen.getByText('あなたは 0 回クリックしました')).toBeInTheDocument();

初期状態で、DOMに’あなたは 0 回クリックしました’というテキストが存在するかチェックしています。countの初期値は0なので、カウントする前は’0回’と表示されます。

userEvent.click(button);
expect(screen.getByText('あなたは 1 回クリックしました')).toBeInTheDocument();

userEvent.clickでbuttonをクリックします。
クリックすると、onClickの処理が走るのでhandleClickが実行されてcountが1つ増えます。

const handleClick = () => {
  setCount((prevCount) => prevCount + 1);
};

結果としてDOMには、’あなたは 1 回クリックしました’というテキストが存在することになります。

まとめ:userEvent.clickを使おう

buttonをクリックするときは、userEvent.clickを使えばOKです。
どんどんuserEvent.clickを使いましょう!
以上。

コメント

タイトルとURLをコピーしました