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


PHPUnit: Multiple datasets on database testing

是否可以在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'
    );
}   

}

可以使用复合数据集。

从手册:

复合数据集对于聚合多个已经 将现有数据集合并为单个数据集。

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

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

Dislaimer:以下内容仅适用于yaml灯具,由于某种原因,XML灯具API不提供相同的功能(已检查的源代码),不要问我为什么,似乎我们应该能够添加多个表,无论夹具文件格式类型如何。

API 有点笨拙,这正是我不喜欢将 args 传递给构造函数的原因,尤其是在这种情况下,但请尝试以下操作(这已经过测试和工作):

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;
    }
...
}