【问题标题】:Functional Testing Symfony with mulitple Doctrine EntityManagers具有多个 Doctrine EntityManager 的功能测试 Symfony
【发布时间】:2019-04-10 01:44:06
【问题描述】:

在 Symfony 4 应用程序中,我配置了多个实体管理器。 我希望我的功能测试能够自动为两位经理创建数据库表。

但是,当我运行测试时; PHP 单元遇到错误提示

PDOException: SQLSTATE[42S02]: 未找到基表或视图:1146 表“test.example”不存在

config/packages/doctrine.yaml:

doctrine:
    dbal:
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
            custom:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4

    orm:
        default_entity_manager: default
        auto_generate_proxy_classes: '%kernel.debug%'
        entity_managers:
            default:
                connection: default
                naming_strategy: doctrine.orm.naming_strategy.underscore
                auto_mapping: true
                mappings:
                    Model:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Model'
                        prefix: 'App\Entity\Model'
                        alias: Model
            custom:
                connection: custom
                naming_strategy: doctrine.orm.naming_strategy.underscore
                mappings:
                    Custom:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Custom'
                        prefix: 'App\Entity\Custom'
                        alias: Custom

为了创建表和加载我目前使用的夹具Liip Functional Test Bundle

一个简单的测试如下所示:

测试\功能\GeneralControllerTest.php:

class GeneralControllerTest extends WebTestCase
{
    /**
     * {@inheritdoc}
     */
    protected function setUp()
    {
        $this->loadFixtures([
            SomeFixtures::class,
            MoreFixtures::class,
        ]);
    }

    /**
     * @dataProvider providePageUris
     * @test
     * @param string $uri
     */
    public function checkThatPageLoads($uri)
    {
        $client = static::createClient();

        /* ... more code ... */

        $client->request(Request::METHOD_GET, $uri);

        static::assertEquals(Response::HTTP_OK, $client->getResponse()->getStatusCode());
    }

    /**
     * @return array
     */
    public function providePageUris()
    {
        return [
            ["/dashboard"],
        ];
    }
}

如何让我的测试用例为其他自定义 Doctrine EntityManagers 创建数据库表?

我已尝试添加:

$this->loadFixtures([], true, "custom");

还有:

$this->runCommand("doctrine:schema:create --env=test --em=custom");

到测试用例的 setUp() 方法,但这并没有产生所需要的。数据库表都需要在任何 Fixture 加载到数据库之前创建。

【问题讨论】:

标签: symfony doctrine symfony4 functional-testing liipfunctionaltestbundle


【解决方案1】:

为了在加载数据夹具时不删除不同实体管理器中的表和连接,我使用不同的环境变量更改了学说配置。

config/packages/doctrine.yaml:

doctrine:
    dbal:
        connections:
            default:
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
            custom:
                url: '%env(resolve:DATABASE_URL_CUSTOM)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4

【讨论】:

    【解决方案2】:

    根据WebTestCase on GitHub 的代码,第二个参数应该包含对象管理器的名称。我不确定指定 custom 是否足够,或者您是否必须指定全名 doctrine.entity_manager.custom

    【讨论】:

    • 当您提供名称 custom 时,WebTestCase 会从 doctrine.yaml 设置加载 custom orm 条目和 connection 条目。问题是每次调用 loadFixtures 函数时都会完全删除数据库。
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 2018-07-31
    • 2021-02-06
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多