正如标题所述,我想知道如何通过方法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);
}
我希望做到这一点吗?如果可以,如何实现?
答案 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
或插入合适的测试夹具。