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 环境中使用。如果您在 prodtest 中,它甚至不会被读取:https://symfony.com/doc/current/configuration.html#the-env-file-environment-variables。在文档的某些部分很清楚,但在其他部分则不太清楚,这可能会造成混淆。


在你的情况下,你可以检查你的 config 文件夹,更具体地说可能在 config/packages/doctrine.yamlconfig/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'