2

我正在使用 Symfony 和 Doctrine 开发一个项目,但我的测试有问题。我正在使用 Fixtures 为测试加载数据,并且我的一些实体之间存在关联。我第一次使用空数据库表运行测试时,测试完美地成功。但是当我再次运行测试时,我得到了一个错误:

Doctrine\DBAL\DBALException:执行“DELETE FROM Ent”时发生异常:

SQLSTATE [23000]:完整性约束违规:1451 无法删除或更新父行:外键约束失败(my_db. Ent, CONSTRAINT FK_FE5D1D1E727ACA70FOREIGN KEY ( parent_id) REFERENCES Ent( id))

错误的原因很明显:当另一行通过外键引用它时,无法删除该行。

如果我首先手动截断禁用外键约束的表并使用空表再次运行测试,则测试再次成功。但是每次运行测试时我都必须重复这一点。

所以问题是:有没有办法让 Symfony 或 PHPUnit 自动处理这个问题?

谢谢!

编辑:我忘了提到我正在使用 Liip\FunctionalTestBundle\Test\WebTestCase 类。

4

2 回答 2

3

我最终按照 Nextar 的建议扩展了 WebTestCase。谢谢!

这是代码:

<?php

namespace Acme\MyBundle\Tests\Controller;

use Liip\FunctionalTestBundle\Test\WebTestCase;

class MyWebTestCase extends WebTestCase {

  protected function loadFixtures(array $classNames, $omName = null, $registryName = 'doctrine', $purgeMode = null) {
    $this->getContainer()->get('doctrine')->getManager()->getConnection()->query(sprintf('SET FOREIGN_KEY_CHECKS=0'));
    $result = parent::loadFixtures($classNames, $omName, $registryName, $purgeMode);
    $this->getContainer()->get('doctrine')->getManager()->getConnection()->query(sprintf('SET FOREIGN_KEY_CHECKS=1'));
    return $result;
  }
}
于 2014-07-10T20:09:49.087 回答
1

有一种方法可以做到这一点,您必须编写自己的 WebTestCase 扩展 Symfony 提供的 WebTestCase

Symfony\Bundle\FrameworkBundle\Test\WebTestCase

在您自己的 WebTestCase 的 loadFixtures 方法中,您只需使用命令组件即可:

  • 删除数据库
  • 创建架构
  • 加载固定装置

不要忘记!如果执行命令,将 --env 定义为 test !否则,您将删除您的产品数据库

然后在你做的每一个功能测试中,整个数据库都将被重建,所有的装置都将被加载

于 2014-07-02T12:35:56.913 回答