私はテスト駆動開発をできるだけ活用したいと思っています。これは素晴らしい作業方法です。
Symfony2 コントローラーが新しいオブジェクトを作成して返すという事実に困惑していますResponse
。
コントローラーを個別に単体テストできるようにしたいです。
どうやってやるんですか?
答えは、コントローラーをプレーンな古い PHP オブジェクトとして作成し、それをサービスとして登録し、依存性注入を使用して新しいResponse
オブジェクト (またはResponse
ファクトリー) を渡すことですか?
ベストアンサー1
通常、コントローラーはさまざまなオブジェクトをプラグインし、正しい順序で接続します。リポジトリを呼び出し、いくつかのオブジェクトを読み取り、レンダリング メソッドを通じてそれらを返します。また、何らかの処理を行う他のハンドラー/マネージャーを呼び出すこともあります。
これは、コントローラーが高レベルのコンポーネントであることを意味します。多くの場合、これはユニット テストではなく機能テストが適切であることを示しています。ユニット テストで 100% のコード カバレッジを目指すべきではありません。次のように考えることができます。コントローラーが呼び出すすべてのもの (モデル、検証、フォーム、リポジトリ) をユニット テストした場合、何が問題になるでしょうか。ほとんどの場合、それは実稼働時に関係するすべての実際のクラスを使用するときにのみ観察されるものです。
また、TDD ではすべてをユニット テストする必要があるわけではないことも指摘しておきます。高レベル コードに機能テストをいくつか行っても問題ありません。前述のように、ユニット テストで低レベル コンポーネントをテストする場合は、それらがどのように連携して動作するかのみをテストする必要がありますが、これはモックでは戻り値が何であるかを指示するため、モックではテストできません。
コントローラーがシステムの各部分をプラグインする以上のことを行う場合は、ユニットテストでテストできるより低レベルのクラスにリファクタリングすることを検討する必要があります。
そこで私の提案は機能テストを使用してコントローラーをテストし、ユニットテストを使用してモデルとビジネス ロジックをテストします。
機能テストに苦労している場合は、次の記事をお読みください。