如何在PHP中重新创建数据库(例如单元测试)

如何在PHP中重新创建数据库(例如单元测试),php,zend-framework,phpunit,doctrine-orm,zend-test,Php,Zend Framework,Phpunit,Doctrine Orm,Zend Test,如何从PHP中重新创建数据库,或者插入默认数据。目前,我打算将该行为用于单元测试 我正在使用条令2,Zend Framework 1.11,Zend_测试进行单元测试 我可以使用CLI doctrine orm:schema-tool:update --force 或 我正在寻找一个PHP的替代品,到目前为止发现 但它看起来像 $tool = new \Doctrine\ORM\Tools\SchemaTool($em); $classes = array( $em->getClas

如何从PHP中重新创建数据库,或者插入默认数据。目前,我打算将该行为用于单元测试

我正在使用条令2,Zend Framework 1.11,
Zend_测试
进行单元测试

我可以使用CLI

doctrine orm:schema-tool:update --force

我正在寻找一个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);
理论支持。试试看。

你可以使用

Doctrine的PHPUnit扩展提供了几个到PHPUnits数据库扩展的挂钩,并提供了一种非常方便的方法来针对数据库测试您的Doctrine 2代码

自述文件中有一些示例,包括一个演示如何动态创建数据库模式的示例。本杰明·埃伯莱是条令2的核心贡献者

另请参见B.Eberlei的使用PHPUnit进行DB测试的最终指南


因为您在设置EntityManager时设置了模型的路径,所以您可以在代码中创建模式,而无需重新声明此路径(也无需声明每个类)。为此,您需要获取对EntityManager配置实例的引用,并获取对ClassMetadataFactory的引用,然后可以从中调用ClassMetadataFactory#getAllMedata()

下面是一个示例,其中我有一个静态引导类,它允许我从任何地方获取对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();
    }
}

这里是symfony的一个教程:你必须手动创建自己的模型并将其持久化。(参考)@Gordon,谢谢你,我认为这将是对我的模型进行单元测试的正确方法,唯一的问题是不用PDO连接,我如何使用Doctrine的连接?我使用的设置与您基本相同,只是我从配置中提取类名列表,这样更易于维护。然而,我发现在每次测试中调用
dropSchema()
createSchema()
非常昂贵,而且运行一大套测试需要花费很长时间。使用PHPUnit装置要快得多。我还必须检查Benjamin的扩展。@Bryan M.,但是fixture会处理数据库模式的更改吗?是的,也许我不会每次都更改数据库模式,但那只是以防万一。他们不会。我的模式经常更改,因此运行手动迁移不会太麻烦。我还将模式缓存到*.sql中,这样可以使重新创建模式的速度稍微加快。只是不要在每个测试上都运行模式重新生成,您应该会没事的。
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();
    }
}