Я слежу за документами 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
Но похоже, что эта конфигурация не используется для тестирования (потому что «NO» не является моим паролем в файле .env). Нужно ли мне сохранять конфигурацию подключения в другом файле для тестирования? И если да, то где мне хранить конфигурацию, чтобы она использовалась в моем тестовом примере?
Заранее благодарю за любую помощь!





Файл .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:[email protected]:3306/db_name'
Я просто попробовал, и он отлично сработал, большое спасибо !! :)