30

私はできる限りテスト駆動開発を使用したいと考えています。これは優れた作業方法です。

ResponseSymfony2 コントローラーが新しいオブジェクトを作成して返すという事実に悩まされています。

コントローラーを単独で単体テストできるようにしたい。

どのようにしますか?

コントローラを Plain Old PHP Object として作成し、それをサービスとして登録し、依存性注入を使用して新しいResponseオブジェクト (またはResponseファクトリ) を渡すのが答えですか?

4

4 に答える 4

56

通常、コントローラーはさまざまなオブジェクトをつなぎ合わせ、正しい順序で接続します。おそらく、彼はリポジトリを呼び出し、いくつかのオブジェクトを読み取り、render メソッドを介してそれらを返します。たぶん、彼は何かをする他のハンドラー/マネージャーを呼び出します。

これは、コントローラーが高レベルのコンポーネントであることを意味します。多くの場合、これは単体テストではなく機能テストが適切であることを示しています。単体テストで 100% のコード カバレッジを目指すべきではありません。たぶん、次のように考えることができます: コントローラーが呼び出すすべて (モデル、検証、フォーム、リポジトリ) を単体テストすると、何がうまくいかないのでしょうか? ほとんどの場合、本番環境で関連するすべての実際のクラスを使用する場合にのみ観察するものです。

また、TDD は、すべてを単体テストする必要があるという意味ではないことも指摘したいと思います。高レベル コードの機能テストを行うことは問題ありません。前述のように、単体テストで低レベルのコンポーネントをテストする場合は、戻り値が何であるかをモックに伝えるため、モックではテストできない、それらがどのように連携しているかをテストする必要があります。

コントローラーがシステムの一部を接続する以上のことを行う場合は、単体テストでテストできるより低レベルのクラスにリファクタリングすることを検討する必要があります。

したがって、私の提案は、機能テストを使用してコントローラーをテストし、単体テストを使用してモデルとビジネス ロジックをテストすることです。

機能テストに苦労している場合は、次を読むことができます。

于 2012-04-12T21:48:03.693 に答える
2

モックを使用して、モデルやその他のオブジェクトをメインコントローラーメソッドのロジックから分離します。http://www.phpunit.de/manual/3.7/en/test-doubles.html#test-doubles.mock-objectsを参照してください。

古いバージョンではクラス全体をモックできると思いますが、最新のphpunit 3.6.10では、動作しないようです。だから私はあなたが依存性注射パターンを残されていると思います

class objss{
    function ss(){
        $x = new zz();
        var_dump($x->z());
    }
}



class MoTest extends PHPUnit_Framework_TestCase{
    public function setUp(){

    }

    public function testA(){
        $class = $this->getMock('zzMock', array('z'), array(), 'zz');
        $class->expects($this->any())->method('z')->will($this->returnValue('2'));

        $obj = new objss();
        $this->assertEquals('2', $obj->ss());
    }
}
于 2012-04-12T15:36:40.877 に答える
1

単体テスト

コントローラーをサービスにリファクタリングします: http://symfony.com/doc/current/cookbook/controller/service.html

次に、それらを簡単に単体テストできます。

機能テスト

もちろん(他の人がすでに述べたように)WebTestCaseここで説明されているように使用できます:http://symfony.com/doc/current/book/testing.html#functional-tests

于 2015-01-30T10:29:49.003 に答える
0

ルイス -​​ 私はここに飛び込むと思った. 上記のアプローチでは、アクション ロジックのより良い部分をテストで複製します。これには何の問題もありません。多くのフレームワーク (特に Rails の RSPEC) では、Controller オブジェクトに対して単体テストと機能テストの両方を実行することを実際に提案しています。ただし、あなたの例を考えると、単体テストをスキップして機能的なアプローチに進むと思います。

私が考えるテストのポイントは、サンドボックス化された環境を作成し、テストを実行し、副作用と直接的な結果を確認することです。テストの大部分がメソッドを分離するポイントに到達した場合は、別のテスト アプローチか、クラスを作成するための別のアプローチのいずれかが必要になる可能性があります。これがコントローラーであり、本質的にスタックのさまざまな部分を接着することを考えると、スタックのさらに上にサンドボックスを作成します。具体的には、次のようなアプローチを使用します。

https://github.com/PolishSymfonyCommunity/SymfonyMockerContainer

私にとってはうまくいきました:)

于 2013-07-03T17:51:10.293 に答える