我有一个使用 Doctrine 2 的 Zend Framework 应用程序(版本 1.11)。我已经设置了 PHPUnit 以在我的模型和表单等上运行测试。测试效果很好,但有一个问题:一旦完成,它们就会将测试数据留在数据库中。这是我的一项测试的基本示例:
class VisaTypeEntityTest extends ModelTestCase
{
public function testCanSaveAndRetrieveVisaType()
{
$addVisaType = new \Entities\VisaTypes();
$addVisaType->setEnglishName('Test Visa Type')
->setJapaneseName('試し')
->setKanaName('タメシ')
->setDescription('Description of the test visa type');
$this->em->persist($addVisaType);
$this->em->flush();
$getVisaType = $this->em->getRepository('\Entities\VisaTypes')
->findOneByEnglishName('Test Visa Type');
$this->assertEquals('Test Visa Type', $getVisaType->getEnglishName());
}
}
显然,数据必须实际输入到数据库中,以确保一切都符合标准。但我不希望每次运行测试时所有测试数据都塞满数据库,我也不想去手动删除它。
有什么我可以做的,比如在测试完成后使用 tearDown() 方法去除测试数据?如果是这样,是否可以将表的 id 字段中的自动增量“回滚”到它们之前的状态?我知道 id 之间是否存在间隙真的无关紧要,但如果有某种方法可以让 Doctrine 重置自动增量值,那就太好了。
最佳答案
<强>1。关于“清理”:
因为您使用的是 InnoDB,所以您可以使用事务将数据库恢复到与测试开始前相同的状态:
因此,在 setUp()
中,您将添加 $this->em->getConnection()->beginTransaction();
并在 tearDown()
$this->em->getConnection()->rollback();
这会将数据库恢复到之前的状态。还可以查看有关“The InnoDB Transaction Model and Locking”的 MySQL 手册,以确保这不会干扰应用程序中的任何其他数据(关键字:隔离级别)。
<强>2。关于回滚自动增量 ID:
据我所知,这是不可能(轻易)实现的。 There is a thread about it on SO其中声明您的应用程序不应该关心自动增量 ID 之间是否存在间隙。如果您使用的是测试数据库(强烈推荐),这就更不用担心了。
关于PHPUnit:测试完成后如何从数据库中删除测试数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17387962/