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.