PHPUnit和MySQL截断错误

Tow*_*wer 14 php mysql phpunit

我很头疼PHPUnit的行为总是TRUNCATE在插入灯具之前一直运行而没有先设置外键检查:

Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint

基本上,PHPUnit尝试在插入fixture之前截断表.我怎么告诉它SET FOREIGN_KEY_CHECKS=0;

Tow*_*wer 28

我找到了答案.我最后通过扩展一个类来覆盖一些方法.

<?php

/**
 * Disables foreign key checks temporarily.
 */
class TruncateOperation extends \PHPUnit_Extensions_Database_Operation_Truncate
{
    public function execute(\PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection, \PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
    {
        $connection->getConnection()->query("SET foreign_key_checks = 0");
        parent::execute($connection, $dataSet);
        $connection->getConnection()->query("SET foreign_key_checks = 1");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后示例用法:

class FooTest extends \PHPUnit_Extensions_Database_TestCase
{
    public function getSetUpOperation()
    {
        $cascadeTruncates = true; // If you want cascading truncates, false otherwise. If unsure choose false.

        return new \PHPUnit_Extensions_Database_Operation_Composite(array(
            new TruncateOperation($cascadeTruncates),
            \PHPUnit_Extensions_Database_Operation_Factory::INSERT()
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我实际上禁用了外键检查并在设置时将其设置回来.显然你应该创建一个具有此功能的基类,并扩展它而不是PHPUnit的TestCase.