使用多学派EntityManager进行功能测试Symfony

时间:2018-11-06 16:13:01

标签: symfony doctrine symfony4 functional-testing liipfunctionaltestbundle

在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

一个简单的测试如下:

tests \ Functional \ 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 EntityManager创建数据库表?

我尝试添加:

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

还有:

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

到测试用例的setUp()方法,但这没有得到所需的结果。将所有Fixture加载到数据库之前,都需要创建数据库表。

2 个答案:

答案 0 :(得分:1)

为了在加载数据固定装置时没有在其他实体管理器中删除表并删除连接,我使用了不同的环境变量来更改了理论配置。

config / packages / doctrine.yaml:

n_jobs

答案 1 :(得分:0)

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