Как я могу в PHP пересоздать мою базу данных (например, для модульного тестирования) - PullRequest
7 голосов
/ 17 декабря 2010

Как мне из PHP воссоздать мою базу данных, возможно, вставив данные по умолчанию. В настоящее время я собираюсь использовать это поведение для модульных тестов.

Я использую Doctrine 2, Zend Framework 1.11, Zend_Test для модульных тестов

Я мог бы использовать CLI

doctrine orm:schema-tool:update --force

или

doctrine orm:schema-tool:drop --force
doctrine orm:schema-tool:create

Я ищу замену PHP, пока нашел это

но это будет выглядеть примерно так

$tool = new \Doctrine\ORM\Tools\SchemaTool($em);
$classes = array(
  $em->getClassMetadata('Entities\User'),
  $em->getClassMetadata('Entities\Profile')
);
$tool->dropSchema($classes, \Doctrine\ORM\Tools\SchemaTool::DROP_DATABASE);
$tool->createSchema($classes);

И я действительно не хочу указывать классы моделей, особенно в процессе разработки, когда они могут измениться. Он должен просто читать из всех классов, указанных в ... ниже ... как и в случае с CLI, вам не нужно указывать классы, которые вы хотите?

$driverImpl = $config->newDefaultAnnotationDriver(array(realpath('../models')));
$config->setMetadataDriverImpl($driverImpl);

Ответы [ 3 ]

5 голосов
/ 17 декабря 2010

Вы можете использовать

Расширение PHPUnit для Doctrine предлагает несколько хуков в расширение базы данных PHPUnits и предлагает очень удобный способ проверки кода Doctrine 2 в базе данных.

В Readme есть несколько примеров, в том числе пример, показывающий, как создать схему базы данных на лету. Бенджамин Эберлей - основной разработчик Doctrine 2.

Также см. Окончательное руководство Б. Эберлей по тестированию БД с помощью PHPUnit

1 голос
/ 18 августа 2011

Поскольку вы установили путь к моделям при настройке EntityManager, вы можете создать схему в коде без необходимости повторного объявления этого пути (и без необходимости объявлять каждый класс).Для этого вам нужно получить ссылку на ваш настроенный экземпляр EntityManager и получить ссылку на ClassMetadataFactory, которую вы затем можете вызвать ClassMetadataFactory # getAllMedata () из.

Вот пример, где у меня есть статический класс Bootstrapэто позволяет мне получить ссылку на EntityManager из любого места, и я воссоздаю схему при вызове setUp () в модульных тестах:

class ModelTestCase extends PHPUnit_Framework_TestCase {

    public function setUp() {
        $em = Bootstrap::getEntityManager();
        $tool = new \Doctrine\ORM\Tools\SchemaTool($em);

        $mdFactory = $em->getMetadataFactory();
        $tool->createSchema($mdFactory->getAllMetadata());
        parent::setUp();
    }
}
0 голосов
/ 17 декабря 2010

Доктрина поддерживает fixtures. Попробуйте.

...