我对 PHPUnit 在插入夹具之前总是运行 TRUNCATE
的行为感到头疼没有首先设置外键检查:
语法错误或访问冲突:1701 无法截断外键约束中引用的表
基本上,PHPUnit 会在插入固定装置之前尝试截断表格。我如何告诉它 SET FOREIGN_KEY_CHECKS=0;
?
最佳答案
我似乎找到了答案。我最终通过扩展类覆盖了一些方法。
<?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");
}
}
然后示例用法:
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()
));
}
}
所以我有效地禁用了外键检查并将它们设置回来(如果它们曾经设置过)。显然,您应该创建一个具有此功能的基类并扩展它,而不是 PHPUnit 的 TestCase。
关于PHPUnit 和 MySQL 截断错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10331445/