Today I wanted to test a database-handling class using PHPUnits PHPUnit_Extensions_Database_TestCase
and an sqlite in-memory database.
On running the tests I always got the following error-messages:
MyDatabaseTest::testDatabaseConnection with data set #0 ()
PHPUnit_Extensions_Database_Operation_Exception: COMPOSITE[TRUNCATE] operation failed on query:
DELETE FROM "[tablename]"
using args: Array
(
)
[SQLSTATE[HY000]: General error: 1 no such table: [tablename]]
WTF…
After some checking what might help I got different solutions:
- Use MySQL as test-backend – No, I want to use an sqlite with in-memory storage as it’s fast and doesn’t require too much setup on a CI-Server
- Use a pre-configured sqlite-file and therefore a file-based sqlite. That might have been possible, but I just wanted to use in-memory….
The solution was rather simple. It seems that PHPUnit deletes the content of the table in question before setting up the table to execute a test. That only works, if the table already exists. Therefore I’ve added a create table xyz
statement right after setting up the in-memory-table. So the test-class now looks like that:
class MyDatabaseTest extends PHPUnit_Extensions_Database_TestCase { protected $pdo = null; /** * @return PHPUnit_Extensions_Database_DB_IDatabaseConnection */ public function getConnection() { if (null === $this->pdo) { $this->pdo = new PDO('sqlite::memory:'); $this->pdo->exec('create table [tablename]([table-definition])'); } return $this->createDefaultDBConnection($this->pdo, ':memory:'); } /** * @return PHPUnit_Extensions_Database_DataSet_IDataSet */ public function getDataSet() { return $this->createXMLDataSet('[path/to/xml-seed-file]'); } public function testDatabaseConnection() { $pdo = $this->getConnection()->getConnection(); // Do your database-tests here using the required pdo-object } }
Perhaps this can help someone to find a solution earlier 😉