Загрузка данных в setUpBeforeClass с помощью LiipFunctionalTestBundle
Как видно из заголовка, я хотел бы знать, как загрузить данные в метод setUpBeforeClass
, Тестовый класс расширяется Liip\FunctionalTestBundle\Test\WebTestCase
,
На данный момент у меня есть это:
public function setUp()
{
$this->client = $this->createClient();
$this->fixtures = $this->loadFixtures([
'App\DataFixtures\MyFixtures',
// more fixtures
])->getReferenceRepository();
}
Однако, похоже, что испытания занимают слишком много времени, и нет необходимости загружать приборы перед каждым испытанием.
Когда я пытался загрузить приборы в setUpBeforeClass
У меня есть ошибка:
Ошибка: использование $this, когда не в контексте объекта в /home/cezar/phpprojects/livegene/vendor/liip/functional-test-bundle/src/Test/WebTestCase.php:252
Просмотр исходного кода 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 ответ
Если все, что вам нужно, это работающий EntityManager с (частично) допустимой схемой базы данных для запроса, вы можете использовать DoctrineTestHelper, предоставляемый Symfony DoctrineBridge:
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, так как это изменит способ обработки данных и работает ли сопоставление с вашими сущностями.
Теперь в ваших тестах вы можете использовать static::$entityManager
как всегда с таблицами или вставьте тестовые приборы, как вы считаете нужным.