EVERSTEEL Tech BlogPublicationへの投稿🗂0からフロントエンドにテストを導入した話ShinyaHinohara2025/10/21に公開2025/10/241件Next.jsReactTestfrontendtechEVERSTEEL Tech BlogPublication株式会社EVERSTEELの技術ブログです。 EVERSTEEL各開発チームの取り組み・調査・TIPSをお届けしていきます。ぜひご覧ください。Discussionyappii1ヶ月前記事を拝読しました。テスト導入の実践例として大変参考になりました! 一点、コンポーネントのテストについて異なる視点を共有させてください。 コールバック関数のテストについて 記事中の「悪いテストの例」として挙げられているコードについて、別の見方もあるのではと感じました: 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を使うことも許容されるのではと思います。 細かい議論になってしまい恐縮ですが、あくまで一つの視点としての提案です。ありがとうございました。 返信を追加
yappii1ヶ月前記事を拝読しました。テスト導入の実践例として大変参考になりました! 一点、コンポーネントのテストについて異なる視点を共有させてください。 コールバック関数のテストについて 記事中の「悪いテストの例」として挙げられているコードについて、別の見方もあるのではと感じました: 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を使うことも許容されるのではと思います。 細かい議論になってしまい恐縮ですが、あくまで一つの視点としての提案です。ありがとうございました。 返信を追加
Discussion
記事を拝読しました。テスト導入の実践例として大変参考になりました!
一点、コンポーネントのテストについて異なる視点を共有させてください。
コールバック関数のテストについて
記事中の「悪いテストの例」として挙げられているコードについて、別の見方もあるのではと感じました:
この例が「❌ 原則2違反:
handleSubmitという内部関数の呼び出しをテストしている」とされていますが、handleSubmitはpropsとして外部から渡されており、コンポーネントのパブリックAPIの一部ではないでしょうか。記事の主旨である「ユーザー目線のテストが重要」という点には全面的に同意します。ただ、コンポーネントには「入力(props)に対する出力(UI + コールバック呼び出し)」の責務があり、
onSubmitが正しい引数で呼ばれることも、このコンポーネントが守るべき契約の一部だと考えます。特に記事でも言及されている共通UIコンポーネント(
components/uis/)はいろんな場所で再利用されてもよいように、個々のコンポーネントレベルでコールバックの動作を保証しておくことは重要かと思います。「実装の詳細」の範囲について
本当にテストすべきでない「実装の詳細」とは、以下のようなものを指すと理解しています:
useStateの値useEffectの実行回数一方、以下はパブリックインターフェースとしてテストすべきではないでしょうか:
data-testidについて
getByRoleの優先について同意します...!ただ、
data-testidも「外部に公開されている明示的に設定した識別子」という意味で契約の一部と考えることもできるのではと感じました。getByRoleが利用できないときの代替手段として、data-testidを使うことも許容されるのではと思います。細かい議論になってしまい恐縮ですが、あくまで一つの視点としての提案です。ありがとうございました。