I have been writing a lot of integration tests lately and wanted to share a quick tip about how to deal with datetime and timestamp columns in the table you are testing. When comparing a dataset with the current state of a table it is hard to deal with modification dates, etc. So the best thing to do is to filter out those dates and not try to compare them.
Here is a simple example.
The database:
CREATE TABLE bugs ( bug_id INTEGER NOT NULL PRIMARY KEY, bug_description VARCHAR(100), bug_status VARCHAR(20), create_date DATETIME, mod_date TIMESTAMP );
The expected result: (Note the missing mod_date column.)
<?xml version="1.0" encoding="UTF-8" ?> <dataset> <table name="bugs"> <column>bug_id</column> <column>bug_description</column> <column>bug_status</column> <column>create_date</column> <row> <value>1</value> <value>this is a new bug</value> <value>open</value> <value>2010-10-15 08:06:53</value> </row> </table> </dataset>
Now for the test:
.... public function testSetAcl() { $model->addBug('this is a new bug'); $expected = $this->createXmlDataSet('expected.xml'); $actual = new PHPUnit_Extensions_Database_DataSet_QueryDataSet($this->getConnection()); $actual->addTable('bugs', 'SELECT bug_id, bug_description, bug_status FROM bugs'); $this->assertDataSetsEqual($expected, $actual); }
The key to this test passing, is the 2nd paramter being passed to $actual->addTable. The default for $actual->addTable is to do a ‘SELECT * FROM bugs’ but that then brings back the mod_date, which you cannot deal with. So specifying the columns to return with ‘SELECT bug_id, bug_description, bug_status FROM bugs’ will remove mod_date from the test and make your life easier.