вторник, 25 мая 2010 г.

Тестирование БД в doctrine и symfony

Часто бывает нужно протестировать функции работающие с базой данных. В этом случаи обычно делаю так:
Загружаем в БД тестовые данные из файла test/fixtures.yml
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true);
$databaseManager = new sfDatabaseManager($configuration);
$connection = $databaseManager->getDatabase("doctrine")->getConnection();

$connection->exec("SET FOREIGN_KEY_CHECKS = 0");
Doctrine::loadData(sfConfig::get('sf_test_dir').'/fixtures.yml');
$connection->exec("SET FOREIGN_KEY_CHECKS = 1");


Это код можно использовать как в unit-тестах, так и в функциональных.

Вот класс для simpletest:
/**
 * базовый класс для тестирования базы данных
 * @author mayorov
 *
 */
class DbUntiTestCase extends UnitTestCase
{

    /**
     *
     * @var Doctrine_Connection
     */
    protected $connection;

    /**
     *
     * @var Doctrine_Connection_Profiler
     */
    protected $profiler;

    function __construct()
    {
        $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true);
        $databaseManager = new sfDatabaseManager($configuration);
        $this->connection = $databaseManager->getDatabase("doctrine")->getConnection();

        $this->profiler = new Doctrine_Connection_Profiler();

        $conn = Doctrine_Manager::connection();
        $conn->setListener($this->profiler);
    }

    function setUp()
    {
        $this->loadFixture(sfConfig::get('sf_test_dir').'/fixtures.yml');
    }

    protected function loadFixture($filePath)
    {
        Doctrine_Manager::connection()->unsetAttribute(Doctrine_Core::ATTR_LISTENER);
        $this->connection->exec("SET FOREIGN_KEY_CHECKS = 0");
        Doctrine::loadData($filePath);
        $this->connection->exec("SET FOREIGN_KEY_CHECKS = 1");
        Doctrine_Manager::connection()->setListener($this->profiler);
    }

    /**
     * вывод лог sql запрсоов выполненых в тесте
     */
    protected function printSqlLog()
    {
        foreach ($this->profiler as $event) {
            echo $event->getQuery() . "\n";
            $params = $event->getParams();
            if( ! empty($params)) {
                echo '( ';
                echo implode(', ', $params);
                echo " )\n";
            }
        }
    }

}

Комментариев нет:

Отправить комментарий