6

我有一个使用 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 重置自动增量值,那就太好了。

4

1 回答 1

8

1.关于“清理”:

因为您使用的是 InnoDB,所以您可以使用事务将数据库恢复到与测试开始之前相同的状态:

因此,setUp()您将添加$this->em->getConnection()->beginTransaction();并在tearDown() $this->em->getConnection()->rollback();这将数据库恢复到以前的状态。还可以查看有关“ InnoDB 事务模型和锁定”的 MySQL 手册,以确保这不会干扰应用程序中的任何其他数据(关键字:隔离级别)。

2.关于回滚自动增量ID:

据我所知,这是不可能的(很容易)。SO上有一个关于它的线程,其中指出您的应用程序不应该关心自动增量ID之间是否存在间隙。如果您使用的是测试数据库(强烈推荐),这应该是一个较小的问题。

于 2013-06-30T09:20:44.840 回答