メインコンテンツまでスキップ

第154章:getBy... findBy... queryBy... の違い

今日のゴール 🎯

テストで要素を探すときに、 「今あるはず?」「あとで出てくる?」「無いことを確かめたい?」を見分けて、3つを迷わず選べるようになるよ😊


まず結論:3つの性格を一言で 🧠💡

  • getBy...「あるはず!」無いと即エラー😤
  • queryBy...「無いかも」無いとnull(平和)🕊️
  • findBy...「そのうち出るはず!」待って探す(Promise)

(Testing Library公式でも、この3タイプの違いは「エラーを投げるか」「Promiseでリトライするか」と説明されてるよ)(testing-library.com)


ちゃんと整理:戻り値・エラー・待つかどうか 📌

種類見つかった見つからない複数見つかった待つ?
getBy...要素を返すエラーエラー
queryBy...要素を返すnullエラー
findBy...Promiseが解決して要素タイムアウトでrejectreject

デフォルトのタイムアウトは 1000ms だよ(公式)(testing-library.com)


使い分けフローチャート(これだけ見ればOK)🗺️✨


まず覚える「型」:全部 “By何々” の前に付くだけ 🧩

getByRole / queryByText / findByLabelText みたいに、前半(get/query/find)だけが性格の違いで、後半(Role/Text/LabelText…)は「探し方」だよ😊 (公式でも getBy... / queryBy... / findBy... という型で説明されてる)(testing-library.com)


例で体に入れよう 💪💕(screen を使うのが基本)

screen を使うのがおすすめだよ(公式でも推奨)(testing-library.com)

サンプル部品:最初は「Loading...」→あとで「Done!」になる 🐣

// LoadingSample.tsx
import { useEffect, useState } from "react";

export function LoadingSample() {
const [done, setDone] = useState(false);

useEffect(() => {
const id = setTimeout(() => setDone(true), 50);
return () => clearTimeout(id);
}, []);

return (
<div>
{!done ? <p>Loading...</p> : <p>Done!</p>}
</div>
);
}

1) getBy...今あるはずを取る ✅😤

「最初に Loading は見えるはず!」みたいなとき。

import { render, screen } from "@testing-library/react";
import { LoadingSample } from "./LoadingSample";

test("最初は Loading... が見える", () => {
render(<LoadingSample />);

const el = screen.getByText("Loading...");
expect(el).toBeInTheDocument();
});

ポイント💡:getBy... は「無いと即エラー」だから、そこが失敗したらテストも即落ちるよ(testing-library.com)


2) findBy...あとで出てくるはずを待つ ✅⏳✨

「Done! はちょっと待てば出る!」みたいなとき。

import { render, screen } from "@testing-library/react";
import { LoadingSample } from "./LoadingSample";

test("しばらくすると Done! が見える", async () => {
render(<LoadingSample />);

const el = await screen.findByText("Done!");
expect(el).toBeInTheDocument();
});

findBy...待ってリトライして探すgetBy... + waitFor の合体)って公式に書いてあるよ🪄(testing-library.com)


3) queryBy...無いことを確認する ✅🕵️‍♀️

「Done! が最初から出てたらおかしい!」とか、 「エラー表示が出てないはず!」みたいなとき。

import { render, screen } from "@testing-library/react";
import { LoadingSample } from "./LoadingSample";

test("最初は Done! はまだ無い", () => {
render(<LoadingSample />);

expect(screen.queryByText("Done!")).not.toBeInTheDocument();
});

queryBy... は **無いとnull**を返すから、「無いのが正解」なテストで超便利だよ🙆‍♀️(testing-library.com)


よくあるハマりどころ集 🧯😵‍💫

❌ 1) “待つべき場面” で getBy... を使う

通信後に出るUIを getBy... で探すと、まだ無いので即エラーになりがち😇 → findBy... にしよっ✅(testing-library.com)

❌ 2) “無いことを確認したい” のに getBy...

無いのが正解なのに、getBy... は無いと怒る💥 → queryBy... にしよっ✅(testing-library.com)

❌ 3) “複数ある” のに getBy... / queryBy...

1個用は 複数マッチでもエラーだよ⚠️ → 複数なら getAllBy... / queryAllBy... / findAllBy... を使う(公式)(testing-library.com)


ちょい発展:待ち方のイメージ図 🧠⏳

(デフォルトタイムアウト 1000ms などは公式の説明どおりだよ)(testing-library.com)


ミニ練習(5分)✍️🌸

次の「どれ使う?」を答えてみてね😊

  1. 画面に「保存」ボタンが最初からある → ✅(    )
  2. API取得後に「ユーザー名」があとで出る → ✅(    )
  3. 初期表示では「エラー表示」が出てないはず → ✅(    )
  4. 「タグ」が3つ並ぶのを取りたい(複数) → ✅(    )

答え👇 1: getBy... / 2: findBy... / 3: queryBy... / 4: getAllBy...(待つなら findAllBy...)(testing-library.com)


まとめ 🎀

  • あるはずgetBy... 😤
  • 無いのが正解queryBy... 🕊️
  • あとで出るfindBy... ⏳✨

次の第155章は、これを使って カウンターアプリのテストを書いていく流れだよ〜!🧪💖