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