1

正如标题所说,我想知道如何在方法中加载数据夹具setUpBeforeClass。测试类扩展了Liip\FunctionalTestBundle\Test\WebTestCase.

目前我有这个:

public function setUp()
{
    $this->client = $this->createClient();
    $this->fixtures = $this->loadFixtures([
        'App\DataFixtures\MyFixtures',
        // more fixtures
    ])->getReferenceRepository();
}

然而,测试似乎花费了太长时间,实际上没有必要在每次测试之前加载固定装置。

当我尝试在其中加载固定装置时setUpBeforeClass出现错误:

错误:当不在 /home/cezar/phpprojects/livegene/vendor/liip/functional-test-bundle/src/Test/WebTestCase.php:252 的对象上下文中时使用 $this

查看LiipFunctionalTestBundle的源代码可以发现以下代码片段:

protected function loadFixtures(array $classNames = [], bool $append = false, ?string $omName = null, string $registryName = 'doctrine', ?int $purgeMode = null): ?AbstractExecutor
{
    $container = $this->getContainer();

    $dbToolCollection = $container->get('liip_functional_test.services.database_tool_collection');
    $dbTool = $dbToolCollection->get($omName, $registryName, $purgeMode, $this);
    $dbTool->setExcludedDoctrineTables($this->excludedDoctrineTables);

    return $dbTool->loadFixtures($classNames, $append);
}

是否有可能做到这一点,我希望什么,如果可以,如何实现?

4

1 回答 1

2

如果你只需要一个工作的 EntityManager 和一个(部分)有效的数据库模式来查询,你可以使用 Symfony DoctrineBridge 提供的 DoctrineTestHelper:

public static function setUpBeforeClass()
{
    $config = DoctrineTestHelper::createTestConfiguration();
    $config->setNamingStrategy(new UnderscoreNamingStrategy());
    $entityManager = DoctrineTestHelper::createTestEntityManager($config);
    $schemaTool = new SchemaTool($entityManager);
    $schemaTool->createSchema([
        // List of entities to create schema for
        $entityManager->getClassMetadata(User::class),
        $entityManager->getClassMetadata(Task::class),
    ]);
    static::$entityManager = $entityManager;
}

默认情况下,这将使用内存中的 SQLite3 进行连接,但您也可以使用配置和适当的驱动程序将其指向任何其他数据库。还要注意注册您拥有的任何自定义 DBAL 类型和 LifecycleEvent-listeners,因为这将改变数据的处理方式以及映射到您的实体是否有效。

现在在您的测试中,您可以static::$entityManager像往常一样使用表格或插入您认为合适的测试夹具。

于 2019-02-26T16:10:35.087 回答