Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPUnit: Multiple datasets on database testing

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

}

like image 603
paul.ago Avatar asked May 27 '12 13:05

paul.ago


2 Answers

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.)

like image 98
webbiedave Avatar answered Nov 11 '22 14:11

webbiedave


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;
    }
...
}
like image 44
Mike Purcell Avatar answered Nov 11 '22 14:11

Mike Purcell