Symfony 4.1 KernelTestCase Репозиторий ConnectionException - PullRequest
0 голосов
/ 24 сентября 2018

Я слежу за документами 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.) Должен ли я сохранять конфигурацию соединения в другом файле для тестирования? И если да, где я должен хранить конфигурацию, чтобы она использовалась в моемtestcase?

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

1 Ответ

0 голосов
/ 24 сентября 2018

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


В вашем случае вы можете проверить папку 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'
...