Skip to content

Instantly share code, notes, and snippets.

@chartjes
Created December 22, 2011 15:15
Show Gist options
  • Save chartjes/1510647 to your computer and use it in GitHub Desktop.
Save chartjes/1510647 to your computer and use it in GitHub Desktop.
Here's my test:
<?php
include 'test_bootstrap.php';
class FranchiseModelTest extends \PHPUnit_Extensions_Database_TestCase
{
protected $_conn;
/**
* @return PHPUnit_Extensions_Database_DB_IDatabaseConnection
*/
public function getConnection()
{
return $this->createDefaultDbConnection(
$this->_conn,
'ibl_stats'
);
}
/**
* @return PHPUnit_Extensions_Database_DataSet_IDataSet
*/
public function getDataSet()
{
return $this->createFlatXmlDataSet(
'./fixtures/franchise-dataset.xml'
);
}
public function setUp()
{
$this->_conn = new PDO(
'pgsql:host=localhost;dbname=ibl_stats',
'stats',
'st@ts=Fun'
);
}
public function tearDown()
{
unset($this->_conn);
}
public function testIdOnlySetOnce()
{
$franchise = new IBL\Franchise();
$id = 25;
$franchise->setId($id);
$this->assertEquals($id, $franchise->getId());
$anotherId = 26;
$franchise->setId($anotherId);
$this->assertEquals($id, $franchise->getId());
}
public function testSaveUpdatesDatabase()
{
$rowCount = $this
->getConnection()
->getRowCount('franchises');
$this->assertEquals(
24,
$rowCount,
'Making sure we have 24 franchises'
);
$mapper = new IBL\FranchiseMapper($this->_conn);
$franchise = new IBL\Franchise();
$franchise->setId(25);
$franchise->setNickname('TST');
$franchise->setName('Test Team');
$franchise->setConference('Conference');
$franchise->setDivision('Division');
$franchise->setIp(0);
$mapper->save($franchise);
// Update existing model
$franchise->setIp(35);
$mapper->save($franchise);
// Reload Franchise record and compare them
$franchise2 = $mapper->findById($franchise->getId());
$this->assertEquals(35, $franchise2->getIp());
// Make sure we have all the expected data in the table
$queryTable = $this
->getConnection()
->createQueryTable('franchises', 'SELECT * FROM franchises');
$expectedTable = $this
->createFlatXmlDataSet('./fixtures/expected-franchises.xml')
->getTable('franchises');
$this->assertTablesEqual(
$expectedTable,
$queryTable
);
// Clean up the franchise
$mapper->delete($franchise);
}
}
expected-franchises.xml is the same as franchise-dataset.xml except I added a record that matches what the test would have added to the database
Error message:
-> % phpunit FranchiseModelTest.php
PHPUnit 3.6.4 by Sebastian Bergmann.
.E
Time: 0 seconds, Memory: 6.50Mb
There was 1 error:
1) FranchiseModelTest::testSaveUpdatesDatabase
Argument 1 passed to PHPUnit_Extensions_Database_TestCase::assertTablesEqual() must implement interface PHPUnit_Extensions_Database_DataSet_ITable, null given, called in /Users/chartjes/Sites/local.ibl/tests/FranchiseModelTest.php on line 93 and defined
/usr/local/Cellar/php/5.3.8/lib/php/PHPUnit/Extensions/Database/TestCase.php:230
/Users/chartjes/Sites/local.ibl/tests/FranchiseModelTest.php:93
FAILURES!
Tests: 2, Assertions: 4, Errors: 1.
@elazar
Copy link

elazar commented Dec 22, 2011

I'm guessing the createFlatXmlDataSet() call in the assignment for $expectedTable is returning null because it can't find the file? Try var_dump()ing the return value of that method call.

@chartjes
Copy link
Author

Hrm, the return value is NULL. But the file is actually there...

chartjes@yggdrasil [10:30:26] [~/Sites/local.ibl/tests/fixtures] [master *]
-> % ls -la
total 816
drwxrwxr-x 8 chartjes staff 272 Dec 21 22:48 .
drwxrwxr-x 18 chartjes staff 612 Dec 22 10:29 ..
-rw-rw-r-- 1 chartjes staff 2667 Dec 21 22:48 expected-franchises.xml
-rw-rw-r-- 1 chartjes staff 2561 Dec 21 22:21 franchise-dataset.xml
-rw-rw-r-- 1 chartjes staff 4987 Dec 5 19:28 franchises.txt
-rw-rw-r-- 1 chartjes staff 13750 Dec 18 21:08 games-24.txt
-rw-rw-r-- 1 chartjes staff 373139 Nov 30 21:28 games.txt
-rw-rw-r-- 1 chartjes staff 4347 Dec 18 22:30 rotations-24.txt

@elazar
Copy link

elazar commented Dec 22, 2011

Try an Xdebug trace to see what PHPUnit internals are doing? Maybe try using something like dirname(FILE) . './fixtures/expected-franchises.xml' to provide a full path instead of a relative one?

@elazar
Copy link

elazar commented Dec 22, 2011

Have you run the XML file through a validator or linter? Are you positive the format is correct?

@chartjes
Copy link
Author

I tried using the dirname(FILE) thing and no difference.

When the XML file through xmllint and it reported no errors and the format is correct

expected-franchises.xml https://gist.github.com/1510736
franchises-dataset.xml https://gist.github.com/1510738

Files were generated via a CLI script

findAll(); echo "Creating XML out of Franchise records...\n"; $xmlDoc = new DOMDocument(); $root = $xmlDoc->appendChild( $xmlDoc->createElement('dataset') ); foreach ($allFranchises as $franchise) { $franchiseRow = $root->appendChild( $xmlDoc->createElement('franchise') ); $franchiseRow->appendChild( $xmlDoc->createAttribute('id') )->appendChild( $xmlDoc->createTextNode($franchise->getId()) ); $franchiseRow->appendChild( $xmlDoc->createAttribute('nickname') )->appendChild( $xmlDoc->createTextNode($franchise->getNickname()) ); $franchiseRow->appendChild( $xmlDoc->createAttribute('name') )->appendChild( $xmlDoc->createTextNode($franchise->getName()) ); $franchiseRow->appendChild( $xmlDoc->createAttribute('conference') )->appendChild( $xmlDoc->createTextNode($franchise->getConference()) ); $franchiseRow->appendChild( $xmlDoc->createAttribute('division') )->appendChild( $xmlDoc->createTextNode($franchise->getDivision()) ); $franchiseRow->appendChild( $xmlDoc->createAttribute('ip') )->appendChild( $xmlDoc->createTextNode($franchise->getIp()) ); } $xmlDoc->formatOutput = true; file_put_contents('./fixtures/franchise-dataset.xml', $xmlDoc->saveXml()); echo "Done\n"; and then I manually added the extra row to get the expected data set

@elazar
Copy link

elazar commented Dec 22, 2011

Darn. Then yeah, best I can suggest is tracing through the code to figure out why it's returning null, because it shouldn't be.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment