Как откатить любую транзакцию при выполнении теста с PHPUnit в symfony2
Я тестирую контроллеры с помощью искателя, но когда я публикую форму, которая не генерирует никаких ошибок, она сохраняет форму в базе данных.
Как я могу помешать ему сделать это, не меняя контроллер и не тестируя что-то еще.
Существует ли наилучшая практика в отношении такого рода тестов? Я попробовал откат, но в ControllerTest больше нет активных транзакций
2 answers
Вам нужно написать свой собственный тестовый клиентский класс, расширяющий Symfony\Bundle\FrameworkBundle\Client. Это связано с тем, что клиент по умолчанию не разделяет объект подключения между запросами (поэтому вы не можете использовать транзакции вне тестового клиента). Если вы расширите тестовый клиент, вы сможете обрабатывать транзакции самостоятельно.
В вашем клиентском классе вам нужно создать статический объект подключения и переопределить метод doRequest(), чтобы каждый раз не создавать новый объект подключения, а использовать наш статический вместо.
Это хорошо описано здесь:
Http://alexandre-salome.fr/blog/Symfony2-Isolation-Of-Tests
Когда у вас есть свой собственный метод doRequest, все, что вам нужно, - это обработать транзакцию, поэтому вы оборачиваете метод handle() с помощью begin и rollback. Ваш метод 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
Макет - это создание пользовательского объекта на основе исходного объекта где разместите свои собственные тестовые элементы управления. Вероятно, в данном случае вас интересует макет менеджера сущностей Доктрины