views:

1626

answers:

2

I'm starting to try and test my Doctrine objects with PHPUnit, and would like to reload the DB from my model objects afresh each time.

My first attempt looks something like this:

class Tests_User extends PHPUnit_Framework_TestCase
{

    public function setUp()
    {

        Doctrine_Manager::connection('mysql://user:pass@localhost/testdb');

        Doctrine::createDatabases();
        Doctrine::createTablesFromModels('../../application/models');

    }

    public function testSavingWorks()
    {

        $user = new User();
        $user->save();

    }

    public function testSavingWorksAgain()
    {

        $user = new User();
        $user->save();

    }

    public function tearDown()
    {

        Doctrine::dropDatabases();

    }

}

The problem is that when setUp() is called again for the second test, createTablesFromModels() fails, so I get an error because none of the tables are present.

I'd really appreciate an example of how someone else has reinitialised a Doctrine connection for PHPUnit or other unit testing purposes.

+1  A: 

So it turns out that createTablesFromModels includes the files in and then compares the lists of defined classes before and after, which is why it's not working twice.

A sequence like the following works when repeated:

Doctrine::loadModels($path);
Doctrine::createTablesFromArray(Doctrine::getLoadedModels());
Ciaran McNulty
A: 

In case you haven't found this already, Jani has posted an approach to help automate the setup/teardown process.

http://codeutopia.net/blog/2008/08/27/database-helper-for-phpunit/

Matthew Lurz