使用LiipFunctionalTestBundle将数据固定装置加载到setUpBeforeClass中

时间:2019-02-26 12:26:02

标签: php symfony symfony4 phpunit-testing liipfunctionaltestbundle

正如标题所述,我想知道如何通过方法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);
}

我希望做到这一点吗?如果可以,如何实现?

1 个答案:

答案 0 :(得分:3)

如果您只需要一个有效的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进行连接,但是您也可以使用config和适当的驱动程序将其指向任何其他数据库。 还要小心注册您拥有的任何自定义DBAL类型和LifecycleEvent-listener,因为这将改变数据的处理方式以及映射到您的实体的工作方式。

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