【问题标题】:Strange Doctrine 2 behaviour with PHPUnitPHPUnit 的奇怪 Doctrine 2 行为
【发布时间】:2012-08-03 10:49:42
【问题描述】:

我正在尝试使用 Doctrine 2 ORM 设置我的 PHPUnit 测试。但是,我遇到了一些奇怪的问题,我只能假设是某种缓存(在 Doctrine 结束时),我无法弄清楚如何克服。这就是我所拥有的:

一个设置函数:

public function setUp() 
{
    $front = Zend_Controller_Front::getInstance();
    $bootstrap = $front->getParam("bootstrap");

    if(!$boostrap) {
        $application = Zend_Registry::get("application");
        $bootstrap = $application->getBootstrap();
    }
    $bootstrap->bootstrap('doctrine');

    $this->em   = $bootstrap->getResource('doctrine');
    $tool       = new \Doctrine\ORM\Tools\SchemaTool($this->em);
    $classes    = $this->em->getMetaDataFactory()->getAllMetaData();

    $tool->dropSchema($classes);
    $tool->createSchema($classes);

    parent::setUp();
}

这基本上旨在为每个测试重置教义实例。我还没有 tearDown() 函数,因为目前,它负责重置模式,如图所示。我应该在这里提到我正在使用 SQLite。

我在一个类中尝试运行两个测试,没有依赖关系。第一个测试插入如下记录:

$value = 5;
$model = new Model();
$model->setUserId($rater->getId());
$model->setValue($value);

$this->em->persist($model);
$this->em->flush();

到目前为止,一切都很好。我在数据库中有一条值为 5 的新记录。

进入下一个测试。这次我要跑:

$value = 3;
$model = new Model();
$model->setUserId($rater->getId());
$model->setValue($value);

$this->em->persist($model);
$this->em->flush();

转储相关表中的所有记录会给我一个结果;再次记录值为 5 的记录。换句话说,第二个测试从第一个测试中获取 $value。 我通过在第二次测试开始时转储所有记录进行了仔细检查,这没有返回任何内容。 Doctrine 中似乎存在一些我不知道的缓存问题。

我已经尝试清除各种我知道 Doctrine 可以确定的缓存,例如:

$cacheDriver = new \Doctrine\Common\Cache\XcacheCache();
$cacheDriver->deleteAll();

任何人都可以提出其他我可以尝试的建议吗?或者在我实现 Doctrine 的方式中是否有一些错误的代码。

谢谢

【问题讨论】:

  • 应该和缓存没有关系,能发一下你的单元测试内容吗?

标签: doctrine-orm phpunit


【解决方案1】:

所以我不完全确定问题出在哪里或是什么,但似乎 Doctrine 一定是在某处缓存。毕竟,我确保我的对象在持久化后但在刷新前具有正确的值。刷新后它的值突然与预期不同。

无论如何,为了解决这个问题,我添加了以下行:

$this->em->clear();

刚从我的 Bootstrap 获得教义资源后。这可确保在删除和重新创建架构之前,从实体管理器中完全清除所有托管实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多