Symfony2测试:灯具和外键问题

时间:2014-07-01 20:07:31

标签: symfony doctrine-orm phpunit fixtures liipfunctionaltestbundle

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

  

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

     

SQLSTATE [23000]:完整性约束违规:1451无法删除或更新父行:外键约束失败(my_dbEnt,CONSTRAINT FK_FE5D1D1E727ACA70 FOREIGN KEY({{ 1}})参考parent_idEnt))

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

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

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

谢谢!

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

2 个答案:

答案 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数据库

然后在每个功能测试中,您将重建整个数据库,并且将加载所有灯具

相关问题