通常、コントローラーはさまざまなオブジェクトをつなぎ合わせ、正しい順序で接続します。おそらく、彼はリポジトリを呼び出し、いくつかのオブジェクトを読み取り、render メソッドを介してそれらを返します。たぶん、彼は何かをする他のハンドラー/マネージャーを呼び出します。
これは、コントローラーが高レベルのコンポーネントであることを意味します。多くの場合、これは単体テストではなく機能テストが適切であることを示しています。単体テストで 100% のコード カバレッジを目指すべきではありません。たぶん、次のように考えることができます: コントローラーが呼び出すすべて (モデル、検証、フォーム、リポジトリ) を単体テストすると、何がうまくいかないのでしょうか? ほとんどの場合、本番環境で関連するすべての実際のクラスを使用する場合にのみ観察するものです。
また、TDD は、すべてを単体テストする必要があるという意味ではないことも指摘したいと思います。高レベル コードの機能テストを行うことは問題ありません。前述のように、単体テストで低レベルのコンポーネントをテストする場合は、戻り値が何であるかをモックに伝えるため、モックではテストできない、それらがどのように連携しているかをテストする必要があります。
コントローラーがシステムの一部を接続する以上のことを行う場合は、単体テストでテストできるより低レベルのクラスにリファクタリングすることを検討する必要があります。
したがって、私の提案は、機能テストを使用してコントローラーをテストし、単体テストを使用してモデルとビジネス ロジックをテストすることです。
機能テストに苦労している場合は、次を読むことができます。