Unit testing 在PHPUnit/DBUnit中设置外键约束
我正在开发用于测试模型函数的单元测试 我在dbunit1.1.2和phpunit3.6.10中使用PHPPDO,我的数据集是一个yml文件 在将装置加载到数据库中时,我需要关闭外键检查。之后,我需要再次打开它,以便可以在这些约束下运行测试 下面是我的通用测试用例文件中的代码片段(而不是整个类文件),我将为我开发的任何新测试用例包含这些代码片段 当我在这些设置下运行测试用例时,我发现$pdo->exec()没有执行 我的方法有什么问题?有更好的选择吗Unit testing 在PHPUnit/DBUnit中设置外键约束,unit-testing,pdo,foreign-keys,phpunit,dbunit,Unit Testing,Pdo,Foreign Keys,Phpunit,Dbunit,我正在开发用于测试模型函数的单元测试 我在dbunit1.1.2和phpunit3.6.10中使用PHPPDO,我的数据集是一个yml文件 在将装置加载到数据库中时,我需要关闭外键检查。之后,我需要再次打开它,以便可以在这些约束下运行测试 下面是我的通用测试用例文件中的代码片段(而不是整个类文件),我将为我开发的任何新测试用例包含这些代码片段 当我在这些设置下运行测试用例时,我发现$pdo->exec()没有执行 我的方法有什么问题?有更好的选择吗 class MyTestCase extend
class MyTestCase extends PHPUnit_Extensions_Database_TestCase {
public function getConnection() {
$this->pdo = $this->getPDO();
echo "BEFORE FOREIGN KEY QUERY\n";
$conn = $this->createDefaultDBConnection($this->pdo, 'my-schema');
$this->pdo->exec("set foreign_key_checks=0");
return $conn;
}
private function getPDO() {
include BASEPATH . '/application/config/database.php';
$dbt = $db['testing'];
$conn_string = sprintf("%s:host=%s;dbname=%s", $dbt['dbdriver'], $dbt['hostname'], $dbt['database']);
$pdo = new PDO($conn_string, $dbt['username'], $dbt['password']);
return $pdo;
}
public function getDataSet() {
echo "BEFORE FOREIGN KEY QUERY in getDataSet\n";
$this->pdo->exec("set foreign_key_checks=1");
return new PHPUnit_Extensions_Database_DataSet_YamlDataSet(ROOTPATH."/application/tests/data/my-dataset.yml");
}
public function setUp() {
parent::setUp();
}
像这样更改函数设置
protected function setUp() {
$conn=$this->getConnection();
$conn->getConnection()->query("set foreign_key_checks=0");
parent::setUp();
$conn->getConnection()->query("set foreign_key_checks=1");
}
有时,可能需要事先手动截断表,并确保数据集的顺序正确,即首先是父表,然后是依赖的子表。然后,您可以避免每次测试都设置外键检查多亏@user2045006和@marcini的评论,我为我的项目创建了以下解决方案
我也希望有更好的解决办法。但这应该是可行的,更好的解决方案就在这里:这可能在以前奏效,但现在不行了。当DBUnit截断一个表时,它还将禁用检查,然后在完成后重新启用它。因此,在任何插入之前都会重新启用检查。我找到了执行此操作的确切位置:。如果需要保留phpunit旧版本的行为,则需要扩展默认的truncate操作类,方法类似于:,并执行相反的操作:在截断时不要触摸外键。这将使您能够以自己的方式禁用外键,并在需要时重新启用。
class MyDbTestCase extends PHPUnit_Extensions_Database_TestCase
{
protected function getConnection()
{
// ... as normal ...
}
protected function getSetUpOperation()
{
// Override
return new PHPUnit_Extensions_Database_Operation_Composite([
PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE(),
new InsertOperationWithoutFkChecks(),
]);
}
}
// Custom subclass
class InsertOperationWithoutFkChecks extends PHPUnit_Extensions_Database_Operation_Insert
{
public function execute(
PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection,
PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet
) {
$connection->getConnection()->exec("SET foreign_key_checks = 0");
parent::execute($connection, $dataSet);
$connection->getConnection()->exec("SET foreign_key_checks = 1");
}
}