3

クローラーを使用してコントローラーをテストしていますが、エラーを生成しないフォームを投稿すると、フォームがデータベースに保存されます。

コントローラーを変更せず、他の何かをテストせずに、彼がそうするのを防ぐにはどうすればよいですか。

この種のテストに関するベストプラクティスはありますか? ロールバックを試みましたが、ControllerTest にはアクティブなトランザクションがありません

4

2 に答える 2

4

Symfony\Bundle\FrameworkBundle\Client を拡張する独自のテスト クライアント クラスを作成する必要があります。これは、デフォルト クライアントがリクエスト間で接続オブジェクトを共有しないためです (そのため、テスト クライアントの外部でトランザクションを使用することはできません)。テストクライアントを拡張すれば、自分でトランザクションを処理できます。

クライアントクラスでは、静的接続オブジェクトを作成し、メソッド doRequest() をオーバーライドして、毎回新しい接続オブジェクトを作成するのを避け、代わりに静的接続オブジェクトを使用する必要があります。

ここでよく説明されています:

http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests

独自の doRequest メソッドがある場合、必要なのはハンドル トランザクションだけなので、begin と rollback で handle() メソッドをラップします。doRequest メソッドは次のようになります。

protected function doRequest($request)
{
    // here you need create your static connection object if it's doesn't exist yet
    // and put it into service container as 'doctrine.dbal.default_connection'

    (...)
    self::$connection->beginTransaction();
    $response = $this->kernel->handle($request);
    self::$connection->rollback();
    (...)

    return $response
}
于 2012-09-14T06:20:21.360 に答える
0

データベーステスト用の PHPUnit のドキュメントを読むことができます

http://www.phpunit.de/manual/3.6/en/database.html

データベースをセットアップし、行った変更を破棄する必要があります。

上記が複雑すぎると思われる場合は、データベース層のモックアップを作成することに興味があるかもしれません

http://www.phpunit.de/manual/3.6/en/test-doubles.html

モックアップは、独自のテスト コントロールを配置した元のオブジェクトに基づいてカスタム オブジェクトを作成します。おそらくこの場合、Doctrine の Entity Manager のモックアップに興味があるでしょう。

于 2012-09-14T07:28:02.277 に答える