Symfony 4.1 KernelTestCase Репозиторий ConnectionException

Я слежу за документами Symfony ( https://symfony.com/doc/current/testing/doctrine.html), пытаясь проверить классы своего репозитория на моей базе данных MySQL. Соответствующая часть кода:

class ProductRepositoryTest extends KernelTestCase
{
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $entityManager;

    /**
     * {@inheritDoc}
     */
    protected function setUp()
    {
        $kernel = self::bootKernel();

        $this->entityManager = $kernel->getContainer()
            ->get('doctrine')
            ->getManager();
    }

    public function testSearchByCategoryName()
    {
        $products = $this->entityManager
            ->getRepository(Product::class)
            ->searchByCategoryName('foo')
        ;

        $this->assertCount(1, $products);
    }

    /**
     * {@inheritDoc}
     */
    protected function tearDown()
    {
        parent::tearDown();

        $this->entityManager->close();
        $this->entityManager = null; // avoid memory leaks
    }
}

Когда я выполняю тестовый класс с PhpUnit, я получаю Doctrine\DBAL\Exception\ConnectionException с сообщением: "Произошло исключение в драйвере: SQLSTATE[HY000] [1045] Доступ запрещен для пользователя" root "@" localhost "(с использованием пароля: нЕТ)".

Я сохранил данные о соединении с базой данных в DATABASE_URL в файле.env, и соединение работает нормально при выполнении: bin/console doctrine:migrations:migrate

Но, похоже, эта конфигурация не используется для тестирования (потому что "НЕТ" - это не мой пароль в файле.env). Нужно ли сохранять конфигурацию соединения в другом файле для тестирования? И если да, где я должен хранить конфигурацию, чтобы она использовалась в моем тестовом примере?

Заранее благодарю за любую помощь!

1 ответ

Решение

.env файл используется только в dev среда. Если вы в prod или в testэто даже не читается: https://symfony.com/doc/current/configuration.html. Это ясно в некоторых частях документа, но меньше в других, что может сбивать с толку.


В вашем случае вы можете проверить свои config папка, более конкретно, вероятно, под config/packages/doctrine.yaml а также config/packages/parameters.yamlи посмотреть, как DATABASE_URL используется (когда он существует). Оттуда вы можете жестко закодировать этот URL в конфигурационных файлах, специфичных для test среда (создание test подпапка под config/packages например), или вы можете дать правильное DATABASE_URL переменная среды для phpunit "вручную" с помощью APP_ENV=... && bin/phpunit ...,

Вот как будет выглядеть решение в первом сценарии:

# config/packages/test/doctrine.yaml
doctrine:
  dbal:
    url: 'mysql://db_user:db_password@127.0.0.1:3306/db_name'
Другие вопросы по тегам