Как отобразить запрос SQL, который вызывает исключение PDOException в Doctrine - PullRequest
1 голос
/ 02 августа 2011

Я играю с Doctrine 2 и PHPUnit и, конечно, иногда что-то идет не так. Вот что такое unittesting. Но когда я получаю исключение PDOEx по той или иной причине, я не вижу запроса, который его вызывает. Пример:

$ phpunit --group database
PHPUnit 3.5.14 by Sebastian Bergmann.

E

Time: 2 seconds, Memory: 14.75Mb

There was 1 error:

1) My\Tests\Entity\MyMappingTest::testLoad
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't11.id' in 'on clause'

/usr/local/svn/php5/libraries/Doctrine/DBAL/Connection.php:613
/usr/local/svn/php5/libraries/Doctrine/ORM/Persisters/BasicEntityPersister.php:569
/usr/local/svn/php5/libraries/Doctrine/ORM/Persisters/BasicEntityPersister.php:624
/usr/local/svn/php5/libraries/Doctrine/ORM/UnitOfWork.php:1979
/usr/local/svn/php5/libraries/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php:139
/usr/local/svn/php5/libraries/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php:44
/usr/local/svn/php5/libraries/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:99
/usr/local/svn/php5/libraries/Doctrine/ORM/Persisters/BasicEntityPersister.php:580
/usr/local/svn/php5/libraries/Doctrine/ORM/EntityRepository.php:130
/usr/local/svn/php5/libraries/Doctrine/ORM/EntityManager.php:350


FAILURES!
Tests: 1, Assertions: 1, Errors: 1.

Все хорошо, но как мне сказать Doctrine или PHPUnit дать мне SQL-запрос, который вызывает это исключение, чтобы у меня была надежда на его отладку? Сейчас это исключение бесполезно. Я попытался var_dumping объект исключения, но это просто повторяется навсегда. Конечно, я должен быть в состоянии сказать Доктрине, чтобы дать мне больше информации?

1 Ответ

2 голосов
/ 02 августа 2011

Вы можете включить собственное ведение журнала Doctrine SQL , или с чуть большим усилием вы можете реализовать Doctrine\DBAL\Logging\SQLLogger для сохранения последнего запроса и переопределить PHPUnit_Framework_TestCase::onNotSuccessfulTest(), чтобы добавить новое исключение в случае PDOException. К сожалению, вы потеряете исходную трассировку стека, но PHP не позволяет изменять сообщение об исключении после его создания. (

Используйте setSQLLogger() на объекте конфигурации для использования вашего регистратора. Сделайте это в PHPUnit bootstrap.php и сделайте его доступным для базового класса тестового набора.

...