ОБНОВЛЕННЫЙ ОТВЕТ
Вы можете создать базовый класс для своих тестовых примеров, что упростит загрузку устройства, используя некоторые классы из Doctrine Data Fixtures библиотека. Этот класс будет выглядеть примерно так:
<?php
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
abstract class FixtureAwareTestCase extends KernelTestCase
{
/**
* @var ORMExecutor
*/
private $fixtureExecutor;
/**
* @var ContainerAwareLoader
*/
private $fixtureLoader;
public function setUp()
{
self::bootKernel();
}
/**
* Adds a new fixture to be loaded.
*
* @param FixtureInterface $fixture
*/
protected function addFixture(FixtureInterface $fixture)
{
$this->getFixtureLoader()->addFixture($fixture);
}
/**
* Executes all the fixtures that have been loaded so far.
*/
protected function executeFixtures()
{
$this->getFixtureExecutor()->execute($this->getFixtureLoader()->getFixtures());
}
/**
* @return ORMExecutor
*/
private function getFixtureExecutor()
{
if (!$this->fixtureExecutor) {
/** @var \Doctrine\ORM\EntityManager $entityManager */
$entityManager = self::$kernel->getContainer()->get('doctrine')->getManager();
$this->fixtureExecutor = new ORMExecutor($entityManager, new ORMPurger($entityManager));
}
return $this->fixtureExecutor;
}
/**
* @return ContainerAwareLoader
*/
private function getFixtureLoader()
{
if (!$this->fixtureLoader) {
$this->fixtureLoader = new ContainerAwareLoader(self::$kernel->getContainer());
}
return $this->fixtureLoader;
}
}
Затем в тестовом примере просто добавьте вышеприведенный класс и перед тестом добавьте все необходимые приспособления и выполните их. Это автоматически очистит вашу базу данных до загрузки светильников. Пример:
class MyTestCase extends FixtureAwareTestCase
{
public function setUp()
{
parent::setUp();
//Base fixture for all tests
$this->addFixture(new FirstFixture());
$this->addFixture(new SecondFixture());
$this->executeFixtures();
//Fixtures are now loaded in a clean DB. Yay!
}
}
OLD ANSWER
(я решил «осудить» этот ответ, потому что он объясняет, как очистить базу данных, не указав, как после этого нужно загрузить приборы).
Есть еще более чистый способ выполнить это без необходимости запуска команд. В основном это состоит в использовании комбинации SchemaTool и ORMPurger. Вы можете создать абстрактный базовый класс, который выполняет такие операции, чтобы избежать повторения их для каждого специализированного тестового примера. Вот пример кода класса теста, который устанавливает базу данных для общего тестового примера:
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\ORM\Tools\SchemaTool;
abstract class DatabaseAwareWebTestCase extends WebTestCase {
public static function setUpBeforeClass() {
parent::setUpBeforeClass();
$kernel = static::createKernel();
$kernel->boot();
$em = $kernel->getContainer()->get('doctrine')->getManager();
$schemaTool = new SchemaTool($em);
$metadata = $em->getMetadataFactory()->getAllMetadata();
//Drop and recreate tables for all entities
$schemaTool->dropSchema($metadata);
$schemaTool->createSchema($metadata);
}
protected function tearDown() {
parent::tearDown();
$purger = new ORMPurger($this->getContainer()->get('doctrine')->getManager());
$purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE);
$purger->purge();
}
}
Таким образом, перед запуском каждого тестового примера, который наследуется от вышеуказанного класса, схема базы данных будет восстановлена с нуля, а затем очищена после каждого тестового прогона.
Надеюсь это поможет.