1

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

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

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

配置/包/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

要创建表和加载 Fixtures,我目前正在使用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 加载到数据库之前,都需要创建数据库表。

4

2 回答 2

2

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

配置/包/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
于 2018-12-11T15:05:05.060 回答
0

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

于 2018-11-06T17:33:44.980 回答