🗂

0からフロントエンドにテストを導入した話

に公開
1
EVERSTEEL Tech Blog

Discussion

yappiiyappii

記事を拝読しました。テスト導入の実践例として大変参考になりました!

一点、コンポーネントのテストについて異なる視点を共有させてください。

コールバック関数のテストについて

記事中の「悪いテストの例」として挙げられているコードについて、別の見方もあるのではと感じました:

expect(handleSubmit).toHaveBeenCalledWith('test@example.com', 'password123');

この例が「❌ 原則2違反: handleSubmitという内部関数の呼び出しをテストしている」とされていますが、handleSubmitはpropsとして外部から渡されており、コンポーネントのパブリックAPIの一部ではないでしょうか。

記事の主旨である「ユーザー目線のテストが重要」という点には全面的に同意します。ただ、コンポーネントには「入力(props)に対する出力(UI + コールバック呼び出し)」の責務があり、onSubmitが正しい引数で呼ばれることも、このコンポーネントが守るべき契約の一部だと考えます。

特に記事でも言及されている共通UIコンポーネント(components/uis/)はいろんな場所で再利用されてもよいように、個々のコンポーネントレベルでコールバックの動作を保証しておくことは重要かと思います。

「実装の詳細」の範囲について

本当にテストすべきでない「実装の詳細」とは、以下のようなものを指すと理解しています:

  • コンポーネント内部のuseStateの値
  • 内部で定義されたヘルパー関数の呼び出し
  • useEffectの実行回数

一方、以下はパブリックインターフェースとしてテストすべきではないでしょうか:

  • propsとして渡されたコールバック関数
  • レンダリング結果(UI)
  • props変更に対する振る舞い

data-testidについて

getByRoleの優先について同意します...!
ただ、data-testidも「外部に公開されている明示的に設定した識別子」という意味で契約の一部と考えることもできるのではと感じました。
getByRole が利用できないときの代替手段として、data-testidを使うことも許容されるのではと思います。


細かい議論になってしまい恐縮ですが、あくまで一つの視点としての提案です。ありがとうございました。