ユーザー操作をテストする方法(`fireEvent`, `userEvent`)

React Testing Library では、フォーム入力・クリックなどのユーザー操作をエミュレートしてテストするために、主に以下の2つのユーティリティが使われます:

  • fireEvent:低レベルのイベントシミュレーター
  • userEvent:よりリアルなユーザー操作に近いAPI(推奨)

🔥 fireEvent の使い方

import { render, screen, fireEvent } from '@testing-library/react'
import MyForm from './MyForm'

test('フォーム入力と送信ができる(fireEvent)', () => {
  render(<MyForm />)

  const input = screen.getByLabelText(/名前/i)
  const button = screen.getByText(/送信/i)

  fireEvent.change(input, { target: { value: '拓磨' } })
  fireEvent.click(button)

  expect(screen.getByText(/こんにちは、拓磨さん/)).toBeInTheDocument()
})
  • fireEvent.changeonChange を発火させる
  • 単純なケースや古いコードとの互換に使える

👤 userEvent の使い方(推奨)

import { render, screen } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import MyForm from './MyForm'

test('フォーム入力と送信ができる(userEvent)', async () => {
  render(<MyForm />)

  const input = screen.getByLabelText(/名前/i)
  const button = screen.getByRole('button', { name: /送信/i })

  await userEvent.type(input, '拓磨')
  await userEvent.click(button)

  expect(await screen.findByText(/こんにちは、拓磨さん/)).toBeInTheDocument()
})
  • userEvent.type():1文字ずつ入力する挙動を再現
  • userEvent.click():マウス操作に近いクリック動作
  • 実際のユーザー行動に近いためテストの信頼性が高い

fireEvent vs userEvent

特徴 fireEvent userEvent
操作の粒度 低レベル(即時) 高レベル(ユーザーに近い)
タイピング挙動 文字を一括挿入 1文字ずつ入力
推奨度 △(単純なケース向き) ✅(実運用レベルでの使用に適している)
非同期対応 await 不要 await が必要な場合がある

✅ まとめ:いつどちらを使うべきか?

シーン 使うべきもの
素早くユニットレベルで確認したい場合 fireEvent
実際のUXに近い操作をシミュレートしたい userEvent ✅推奨
E2Eテストに近い動作検証をしたい userEvent

📦 インストール補足

npm install --save-dev @testing-library/user-event

🔗 参考リンク

コメントを残す 0

Your email address will not be published. Required fields are marked *