В случае, если нам нужно протестировать экшены контроллера, при этом предварительно очистив данные из базы данных, можно использовать класс ORMPurger. Он является частью пакета doctrine/data-fixtures, который в свою очередь является зависимостью doctrine/doctrine-fixtures-bundle.
Таким образом, для использования ORMPurger нужно установить либо:
composer require --dev doctrine/doctrine-fixtures-bundle
Скорее всего doctrine-fixtures-bundle вам и нужен, чтобы можно было создавать fixtures.
Либо хотя-бы:
composer require --dev doctrine/data-fixtures
Теперь можно добавить код в тест, который является наследником WebTestCase.
self::bootKernel(); // returns the real and unchanged service container $container = self::$kernel->getContainer(); $entityManager = $container->get('doctrine.orm.entity_manager'); $purger = new ORMPurger($entityManager); $purger->setPurgeMode(ORMPurger::PURGE_MODE_DELETE); $purger->purge();
Пример теста целиком:
<?php namespace App\Tests\Controller; use Doctrine\Common\DataFixtures\Purger\ORMPurger; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\HttpFoundation\Response; class CategoryControllerTest extends WebTestCase { public function testIndexAction() { self::bootKernel(); // returns the real and unchanged service container $container = self::$kernel->getContainer(); $entityManager = $container->get('doctrine.orm.entity_manager'); $purger = new ORMPurger($entityManager); $purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE); $purger->purge(); $client = static::createClient(); $crawler = $client->request('GET', '/category/'); $this->assertEquals( Response::HTTP_OK, $client->getResponse()->getStatusCode() ); $this->assertContains( 'Категории', $crawler->filter('h1')->text() ); $this->assertEquals( 0, $crawler->filter('table.category-list .category')->count(), 'Expected no categories at the start of test' ); $this->assertContains( 'Нет созданных категорий', $crawler->filter('table.category-list')->text() ); } }
PURGE_MODE_DELETE - используется в данном случае, так в базе данных есть внешние ключи. Если внешних ключей нет, то можно использовать сразу PURGE_MODE_TRUNCATE, который и AI сбросит на начало.