首页 > 解决方案 > 如何确保单元测试原则正试图加载到与 dev 相同的数据库?

问题描述

我想在 Symfony 中进行一些单元测试,并尝试测试已经有效的东西,如下所示:

<?php namespace App\Tests\Api\Controller;

use Symfony\Component\HttpFoundation\Request;
use App\Controller\Admin\ProductAdminController;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

/**
 * Class ProductsAdminControllerTest
 * @package App\Tests\Api\Controller
 */
class ProductsAdminControllerTest extends WebTestCase
{

    protected function setUp()
    {
        $kernel = static::createKernel();
        $kernel->boot();
        static::$container = $kernel->getContainer();
        /*$this->_em = $kernel->getContainer()->get('doctrine.orm.entity_manager');
        $this->_em->beginTransaction();*/
    }

    public function testSearchProductsEmpty()
    {
        $request = new Request([], [
            "product_name" => ""
        ]);
        $controller = new ProductsAdminController();
        $controller->setContainer(static::$container);
        $controller->getProducts($request);
        //$products = json_decode($controller->getProducts($request));
        $this->assertEquals(1, 1);
    }
}

当然,这将在我克服当前的问题后进行修改,即无论我做什么,我都会得到错误

Doctrine\DBAL\Exception\ConnectionException:驱动程序中发生异常:SQLSTATE [HY000] [1045] 用户'db_user'@'localhost'的访问被拒绝(使用密码:YES)

当然,我的开发环境连接的数据库具有不同的凭据,我想确保我的单元测试使用相同的凭据。如何做到这一点?

标签: mysqlunit-testingsymfonydoctrine

解决方案


如果你想为不同的环境使用不同的连接参数,你可以通过在 config/packages/{env}/doctrine.yaml 中创建文件来覆盖配置

对于测试,您可以创建 config/packages/test/doctrine.yaml

doctrine:
    dbal:
        # configure these for your database server
        url: 'mysql://db_user4test:db_password4test@host4test:3306/dbname4test'

phpunit 将使用此配置。

否则您可以创建一个 .env.test 并覆盖配置(自定义数据库 URL/环境变量

[编辑]@LajosArpad 建议的另一种方法是添加 phpunit.xml.dist:

<env name="DATABASE_URL" value="mysql://db_user4test:db_password4test@host4test:3306/dbname4test" />

请参阅更改功能测试的数据库设置


推荐阅读