11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

要素があるかどうかのテストにtoBeInTheDocumentを使っていませんか?

Last updated at Posted at 2024-05-07

概要

質問来てた。
Q. testing-library で要素があるかどうかを厳密にテストしたいときはどうすればいいですか。

結論、 toBeInTheDocument ではなく toBeVisible を使おう。


こんにちは、ゆめみに新卒フロントエンドエンジニアとして4月から働き出しましたkawabataです。

要素があるかどうかのテストを書いていたところ、toBeVisible という関数があることをチームメンバーから教えてもらいました。

toBeInTheDocumentとtoBeVisibleの違い

toBeInTheDocument
は、要素がDOMツリー上に存在するかどうかを確認するもので、要素の可視性は考慮しません。

toBeVisible は、次の属性などを確認して要素が実際に表示されているかをチェックします。

  1. cssプロパティのdisplayがnoneに設定されていない
  2. cssプロパティのvisibilityがhiddenかcollapseに設定されていない
  3. cssプロパティのopacityが0に設定されていない
  4. 親要素も表示される(DOMツリーの一番上まで表示される)
  5. hidden属性を持たない

例えば、次のようにdisplay: noneが指定されている場合、視覚的には表示されていませんが、toBeInTheDocumentを使用するとテストは通過してしまいます。

<input
 value={value}
 style={{ display: 'none' }}
 onChange={(event) => {
  onChange(event);
 }}
 placeholder="名前を入力する"
/>
const input = await canvas.findByPlaceholderText('名前を入力する');
await expect(input).toBeInTheDocument(); // display: noneにも関わらずPASSしてしまう

このような場合にはtoBeVisibleを用いることで、より厳密なテストが可能です。

11
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?