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'