Symfony2 PHPUnit, немного длинный тест, фатальная ошибка, связанная с Monolog

Я сузил свою проблему до одного модульного теста, который включает довольно чистый запрос dbal. Запрос включает вложенные наборы, и сбой происходит, когда я перехожу с 3 на 4 уровня иерархических категорий. Очень мало изменений с точки зрения времени выполнения. И функциональность, с которой я работаю, не вызывает проблем на 10 уровне. Однако в PhpUnit, когда я запускаю тест с 4 или более уровнями, я получаю фатальную ошибку.

*Подводя итог, можно сказать, что запрос, который может занять на долю секунды больше, чем обычно, ИЛИ чуть больше ресурсов, приносит мне php fatal error из PHPUnit *

И ошибка выглядит так:

Неустранимая ошибка: вызов неопределенного метода Monolog\Formatter\LineFormatter::stopEvent() в /var/www/my-app/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/Stopwatch.php в строке 92

Кто-то здесь столкнулся с фатальной ошибкой phpUnit в строке 92 как Что ж. Может ли это быть связано??

Я перечислил некоторые причудливые способы (ниже), чтобы обойти мою проблему, но я все же хотел бы знать, почему такой простой тест вызывает эту проблему.

  • Запустите PhpUnit с параметром processIsolation равным «true».
  • Не обращайтесь к static::createClient(); в методе setUpBeforeClass()

У меня был уважаемый член #symfony (Stof), который предположил, что это похоже на то, что я неправильно ввожу @logger в службу... но я подтвердил, что это не похоже на то, взяв службу регистратора ни в одной из моих услуг.

Может быть, эта проблема как-то связана с тайм-аутом? (Ошибка упоминает stopevent и stopwatch). Или, может быть, эта ошибка как-то связана с доступом к $client = static::createClient(); в setUpBeforeClass().. а затем доступ снова в предыдущих тестах.. В любом случае.. это сбивает меня с толку и, насколько я могу судить, все остальное в моей установке Symfony2 (2.1.1) работает отлично.

* LINE 92 файла Stopwatch.php .. исходный файл github здесь *

 /**
 * Stops an event.
 * @param string $name The event name
 * @return StopwatchEvent A StopwatchEvent instance
 */
public function stop($name)
{ return end($this->activeSections)->stopEvent($name);}

person JustinP    schedule 14.09.2012    source источник
comment
Можете ли вы показать строку 92 файла Stopwatch.php и несколько предшествующих строк?   -  person Mike Brant    schedule 14.09.2012
comment
Я добавил строку 92 в основной раздел со ссылкой на источник Stopwatch.php на github.. Похоже, он пытается вести себя как секундомер... Фатальная ошибка - это большой тупик. Кажется, что по пути что-то не загружается и, следовательно, выдает ошибку. Но почему изменение довольно простого запроса влияет на то, что загружается?   -  person JustinP    schedule 14.09.2012


Ответы (1)


В ПОРЯДКЕ. Итак, вы берете последний элемент из массива $this->activeSections, и они пытаются запустить на нем метод stopEvent(). В этом случае может показаться, что класс LineFormatter не имеет доступного ему метода.

Я не знаком с Monolog, но бегло взглянув на их последний репозиторий GitHUb, я вижу, что ни классы LineFormatter, ни NormalizerFormatter, от которых он наследуется, не имеют такого метода.

Похоже, что Monolog плохо работает с Symfony. И что без модификации Monolog и/или класса Symfony Stopwatch вы не сможете использовать Stopwatch для профилирования своего кода, связанного с Monolog.

person Mike Brant    schedule 14.09.2012
comment
Редактирование файлов усложняет ситуацию. Я мог бы запустить тесты phpunit с processIsolation установленным на «true»... можете ли вы пролить свет на эту проблему? - person JustinP; 14.09.2012
comment
Было бы очень сложно сказать, почему изоляция процессов может привести к другим результатам, не зная всего набора модульных тестов, который вы используете. Возможно, у вас есть элемент из одного теста, который не удаляется при демонтаже теста и, следовательно, загрязняет последующий тест, выполняемый в том же процессе. - person Mike Brant; 15.09.2012
comment
Майк, все еще сложно сказать, я довольно долго разбирался с этой проблемой... временами, изолируя отдельные строки, тонны отладки. Я чувствую, что вы рассмотрели две основные причины возникновения этой проблемы. # 1 - что-то загрязняется по пути. #2 - Monolog/Phpunit/Symfony не очень хорошо работают. - person JustinP; 17.09.2012