ユーザー操作をテストする方法(`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.change
はonChange
を発火させる- 単純なケースや古いコードとの互換に使える
👤 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
🔗 参考リンク