React Testing Libraryを使ったテストの書き方
ドキュメント
まず基本の基本はドキュメントを読む。
https://testing-library.com/docs/react-testing-library/intro/
Common mistakes with React Testing Libraryを読む
Common mistakes with React Testing Libraryは、
React Testing Libraryを作ったKent C. Doddsが書いた記事で、
React Testing Libraryの正しい使い方や、よくある間違いを紹介している。
日本語訳はここで読める。
その中でも特に気になったものをいくつかメモっておく。
container
にクエリするのをやめよう。
シンプルにテストが読みにくくなるし、テストが壊れやすくなるからだとか。
// ❌const { container } = render(<Example />)const button = container.querySelector('.btn-primary')expect(button).toHaveTextContent(/click me/i)
// ✅render(<Example />)screen.getByRole('button', {name: /click me/i})
waitFor
の中に副作用を書かない。
waitFor
の中に副作用を書くと、その副作用が複数回発生する可能性があるとか。
// ❌await waitFor(() => { fireEvent.keyDown(input, { key: 'ArrowDown' }) expect(screen.getAllByRole('listitem')).toHaveLength(3)})
// ✅fireEvent.keyDown(input, { key: 'ArrowDown' })await waitFor(() => { expect(screen.getAllByRole('listitem')).toHaveLength(3)})
query
は「存在しないことをチェックする」場合以外には使わない様にしよう
query*
系の関数は、要素が見つからなかった場合にnull
を返すのが特徴。
というか、それが唯一の用途らしい。