symfony4 Пример использования ORMPurger для WebTestCase

В случае, если нам нужно протестировать экшены контроллера, при этом предварительно очистив данные из базы данных, можно использовать класс 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 сбросит на начало.

 
 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться