Symfony 4.1 KernelTestCase存储库ConnectionException

时间:2018-09-24 16:45:40

标签: doctrine phpunit symfony4 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'的访问被拒绝(使用密码:否)”。

我将数据库连接数据存储在.env文件的DATABASE_URL中,并且在执行以下操作时连接正常:bin / console doctrine:migrations:migrate

但是似乎此配置未用于测试(因为'.env'不是我在.env文件中的密码)。我是否必须将连接配置存储在另一个文件中进行测试?如果是的话,我必须在哪里存储配置,以便在我的测试用例中使用它?

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

.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进行硬编码(例如,在test下创建config/packages子文件夹),或者可以给正确的{{1} }使用DATABASE_URL“手动”将环境变量设置为phpunit

这是第一种情况下的解决方案:

APP_ENV=... && bin/phpunit ...