PHPUnit:数据库测试上的多个数据集

7

是否可以在PHPUnit上加载多个平面XML数据集以加载大量的固定装置?

我们正在编写一个相当复杂的应用程序,XML数据集变得非常庞大,因此我希望将其分成2-3个XML。

以下是测试用例的当前代码:

<?php

class My_TestBase extends Zend_Test_PHPUnit_DatabaseTestCase{ 

/**
 * Zend_Application
 * @var Zend_Application 
 */
protected $_application;

/**
 * Connection
 * 
 * @var Zend_Test_PHPUnit_Db_Connection
 */
private $_connection;

/**
 * Returns the test database connection.
 *
 * @link http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_PHPUnit_Database+-+Benjamin+Eberlei
 * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
 */
protected function getConnection(){

    if($this->_connection === null){

        $Resources = $this->_application->getOption("resources");

        $conn = Zend_Db::factory($Resources["db"]["adapter"], $Resources["db"]["params"]);          
        $this->_connection = $this->createZendDbConnection($conn, $Resources["db"]["params"]["dbname"]);
    }

    return $this->_connection;
}


/**
 * Returns the test dataset.
 * 
 * @link http://framework.zend.com/wiki/display/ZFPROP/Zend_Test_PHPUnit_Database+-+Benjamin+Eberlei
 * @return PHPUnit_Extensions_Database_DataSet_IDataSet
 */
protected function getDataSet(){

    return $this->createFlatXMLDataSet(__DIR__."/seed_data.xml");
}

/**
 * Setup
 */
protected function setUp(){

    $this->_application = new Zend_Application(
        APPLICATION_ENV,
        APPLICATION_PATH . '/configs/application.ini'
    );
}   

}


哇,我也遇到了同样的问题,但与其处理复杂的数据集,我更愿意将它们保持原子性,以便在其他测试中使用。紧密耦合数据集与特定测试并没有太多意义。你解决了吗? - Mike Purcell
很遗憾,不行!我们的每个测试都需要许多固定装置(我们有相当多的表格链接在一起),为每个测试用例复制这些固定装置到许多文件中会给我们带来维护上的痛苦。唯一的解决方法是使用分离的XML固定装置构建一些Zend_Test_PHPUnit_DatabaseTestCase的包装类并编写一个“addXmlFile”方法,但我没有时间这样做。下次我肯定会使用需要时加载的单独的yaml固定装置。 - paul.ago
2个回答

8
你可以使用组合数据集
来自手册:

组合数据集非常有用,可以将多个已存在的数据集聚合到一个单一的数据集中。

public function getDataSet()
{
    $ds1 = $this->createFlatXmlDataSet('fixture1.xml');
    $ds2 = $this->createFlatXmlDataSet('fixture2.xml');

    $compositeDs = new PHPUnit_Extensions_Database_DataSet_CompositeDataSet();
    $compositeDs->addDataSet($ds1);
    $compositeDs->addDataSet($ds2);

    return $compositeDs;
}

上面的代码示例直接来自文档,但似乎缺少构造函数参数。当组合时,文档也不正确地允许在多个数据集中定义表格。


这是一个不错的解决方案,下次需要时我会尝试。谢谢。 - paul.ago
我根据 https://github.com/sebastianbergmann/dbunit/blob/master/PHPUnit/Extensions/Database/DataSet/CompositeDataSet.php 修复了示例代码,构造函数将自动调用 addDataSet 方法。 - Guillermo Mansilla

2

免责声明:以下内容仅适用于yaml测试数据,由于某种原因,xml测试数据的API不支持相同的功能(已检查源代码),请勿询问原因,似乎我们应该能够添加多个表而不管测试数据文件格式类型。

API有些笨重,这就是为什么我不喜欢在构造函数中传递参数,特别是在这种情况下,但请尝试以下操作(已经测试并且有效):

class MyTest extends PHPUnit_Extensions_Database_TestCase
{
    protected function getDataset()
    {
        $primary = new PHPUnit_Extensions_Database_DataSet_YamlDataSet('etc/fixture/dbname/table1.yml');

        $primary->addYamlFile('etc/fixture/dbname/table2.yml');
        $primary->addYamlFile('etc/fixture/dbname/table3.yml');

        return $primary;
    }
...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接