クローラーを使用してコントローラーをテストしていますが、エラーを生成しないフォームを投稿すると、フォームがデータベースに保存されます。
コントローラーを変更せず、他の何かをテストせずに、彼がそうするのを防ぐにはどうすればよいですか。
この種のテストに関するベストプラクティスはありますか? ロールバックを試みましたが、ControllerTest にはアクティブなトランザクションがありません
クローラーを使用してコントローラーをテストしていますが、エラーを生成しないフォームを投稿すると、フォームがデータベースに保存されます。
コントローラーを変更せず、他の何かをテストせずに、彼がそうするのを防ぐにはどうすればよいですか。
この種のテストに関するベストプラクティスはありますか? ロールバックを試みましたが、ControllerTest にはアクティブなトランザクションがありません
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
}
データベーステスト用の 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 のモックアップに興味があるでしょう。