7

Is it possible to load multiple flat xml datasets on PHPUnit to load lots of fixtures?

We are writing a rather complex application and the xml dataset is getting pretty big, so I would like to slip it into 2-3 xml.

Here is the current code for a test case:

<?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'
    );
}   

}

paul.ago
  • 3,904
  • 1
  • 22
  • 15
  • Wow, just ran into this same issue, but rather than dealing with complex datasets, I'd prefer to keep them atomic so they can be used in other tests. Doesn't make much sense to tightly couple datasets to a specific test. Were you able to figure it out? – Mike Purcell Aug 06 '12 at 21:21
  • Sadly, no! We have a lot of fixtures required on every test (we have quite a few tables linked together), replicate the fixtures in many files for each test case can be a pain to mantain for us. The only way to go with splitted XML fixtures is build some wrapper class of Zend_Test_PHPUnit_DatabaseTestCase and code a "addXmlFile" method, but i had no time to do so. Next time i would definitively use separate yaml fixtures loaded when needed. – paul.ago Aug 07 '12 at 08:13

2 Answers2

8

You can use composite datasets.

From the manual:

The composite DataSet is very useful for aggregating several already existing datasets into a single dataset.

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

(Above code example is straight from the docs but appears to be missing the constructor parameter. The docs are also incorrect about allowing a table to be defined in more than one data set when compositing.)

webbiedave
  • 48,414
  • 8
  • 88
  • 101
  • That is a neat solution, will try next time i need. thank you – paul.ago Apr 16 '13 at 08:23
  • I fixed the example code, according to https://github.com/sebastianbergmann/dbunit/blob/master/PHPUnit/Extensions/Database/DataSet/CompositeDataSet.php the constructor will automatically call addDataSet method – Guillermo Mansilla Sep 02 '14 at 13:08
2

Dislaimer: The following will only work for yaml fixtures, for some reason the xml fixtures API DOES NOT afford the same functionality (checked source code), don't ask me why, seems like we should be able to add multiple tables regardless of the fixture file format type.

The API is a bit clumsy, and exactly why I don't like passing args to constructors, especially in this case, but try the following (this was tested and worked):

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;
    }
...
}
Mike Purcell
  • 19,847
  • 10
  • 52
  • 89