Как откатить любую транзакцию при выполнении теста с PHPUnit в symfony2


Я тестирую контроллеры с помощью искателя, но когда я публикую форму, которая не генерирует никаких ошибок, она сохраняет форму в базе данных.

Как я могу помешать ему сделать это, не меняя контроллер и не тестируя что-то еще.

Существует ли наилучшая практика в отношении такого рода тестов? Я попробовал откат, но в ControllerTest больше нет активных транзакций

Author: Elnur Abdurrakhimov, 2012-09-13

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
}
 4
Author: Cyprian, 2012-09-14 06:20:21

Вы можете прочитать документацию PHPUnit для тестирования базы данных

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

Вам потребуется настроить свою базу данных и отменить внесенные изменения.

Если вы считаете, что вышесказанное слишком сложно, возможно, вам интересно сделать макет вашего слоя базы данных

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

Макет - это создание пользовательского объекта на основе исходного объекта где разместите свои собственные тестовые элементы управления. Вероятно, в данном случае вас интересует макет менеджера сущностей Доктрины

 0
Author: Maks3w, 2012-09-14 07:28:02