7

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

我正在使用 Doctrine 2、Zend Framework 1.11Zend_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);
4

3 回答 3

5

您可以使用

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

自述文件中有一些示例,包括一个显示如何动态创建数据库模式的示例。Benjamin Eberlei 是 Doctrine 2 的核心贡献者。

另请参阅 B. Eberlei 的使用 PHPUnit 进行数据库测试的终极指南

于 2010-12-17T14:07:20.920 回答
1

因为您在设置 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();
    }
}
于 2011-08-18T17:00:00.903 回答
0

教义支持fixtures。试试看。

于 2010-12-17T11:50:34.857 回答