Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 在PHPUnit/DBUnit中设置外键约束_Unit Testing_Pdo_Foreign Keys_Phpunit_Dbunit - Fatal编程技术网

Unit testing 在PHPUnit/DBUnit中设置外键约束

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

我正在开发用于测试模型函数的单元测试

我在dbunit1.1.2和phpunit3.6.10中使用PHPPDO,我的数据集是一个yml文件

在将装置加载到数据库中时,我需要关闭外键检查。之后,我需要再次打开它,以便可以在这些约束下运行测试

下面是我的通用测试用例文件中的代码片段(而不是整个类文件),我将为我开发的任何新测试用例包含这些代码片段

当我在这些设置下运行测试用例时,我发现$pdo->exec()没有执行

我的方法有什么问题?有更好的选择吗

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");
    }
}