Symfony 4.1 KernelTestCase 存储库 ConnectionException
Symfony 4.1 KernelTestCase Repository 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 消息:"An exception occurred in driver: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)".
我将数据库连接数据存储在 .env 文件的 DATABASE_URL 中,执行时连接正常: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
是如何使用的(当它存在)。从那里,您可以在特定于 test
环境的配置文件中对 URL 进行硬编码(例如,在 config/packages
下创建一个 test
子文件夹),或者您可以提供适当的使用 APP_ENV=... && bin/phpunit ...
.
DATABASE_URL
环境变量到 phpunit
"manually"
这是第一种情况下的解决方案:
# config/packages/test/doctrine.yaml
doctrine:
dbal:
url: 'mysql://db_user:db_password@127.0.0.1:3306/db_name'
我正在关注 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 消息:"An exception occurred in driver: SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO)".
我将数据库连接数据存储在 .env 文件的 DATABASE_URL 中,执行时连接正常: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
是如何使用的(当它存在)。从那里,您可以在特定于 test
环境的配置文件中对 URL 进行硬编码(例如,在 config/packages
下创建一个 test
子文件夹),或者您可以提供适当的使用 APP_ENV=... && bin/phpunit ...
.
DATABASE_URL
环境变量到 phpunit
"manually"
这是第一种情况下的解决方案:
# config/packages/test/doctrine.yaml
doctrine:
dbal:
url: 'mysql://db_user:db_password@127.0.0.1:3306/db_name'