我正在使用Symfony和Doctrine开发一个项目,我的测试存在问题。 我正在使用Fixtures为测试加载数据,我的一些实体之间有关联。 我第一次使用空DB表运行测试时,测试成功完美。但是当我再次运行测试时,我收到了一个错误:
Doctrine \ DBAL \ DBALException:执行'DELETE FROM Ent'时发生异常:
SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:外键约束失败(
my_db
。Ent
,CONSTRAINTFK_FE5D1D1E727ACA70
FOREIGN KEY({{ 1}})参考parent_id
(Ent
))
错误的原因很明显:当另一行通过外键引用时,无法删除行。
如果我先手动截断禁用外键约束的表并再次使用空表运行测试,则测试再次成功。但是每次运行测试时我都要重复这个。
所以问题是:有没有办法让Symfony或PHPUnit自动处理?
谢谢!
编辑: 我忘了提到我正在使用Liip \ FunctionalTestBundle \ Test \ WebTestCase类。
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
有一种方法可以做到这一点,你必须编写自己的WebTestCase,它扩展了Symfony提供的那个
Symfony\Bundle\FrameworkBundle\Test\WebTestCase
在您自己的WebTestCase的loadFixtures Mehod中,您只需使用命令组件:
别忘了! 如果执行命令,请将--env定义为test! 否则你将丢弃你的prod数据库
然后在每个功能测试中,您将重建整个数据库,并且将加载所有灯具