У меня возникла проблема с segfaulting PHPUnit, и я не мог найти ответ, поэтому, надеюсь, это поможет кому-то с такой же проблемой позже.
PHPUnit был segfaulting, но только:
- Если произошла ошибка (или более одной)
- После того, как все тесты были выполнены, но до того, как ошибки были напечатаны
Через некоторое время я понял, что это из-за сбоевв тестах, в которых использовались поставщики данных, в частности, для поставщиков данных, которые передавали объекты с большим количеством рекурсивных ссылок.Наконец прозвенел звонок, и я немного покопался: проблема в том, что когда вы используете провайдеров данных и тест не пройден, PHPUnit пытается создать строковое представление предоставленных аргументов для описания ошибки, чтобы сообщить вам, что не удалось, но этопроблематично, когда один из аргументов имеет некоторую бесконечную рекурсию.Фактически, PHPUnit делает в PHPUnit_Framework_TestCase::dataToString()
(вокруг строки 1612) вывод всех аргументов, предоставленных поставщиком данных, используя print_r
, что вызывает segfault, когда PHP пытается создать строковое представление бесконечно рекурсивного объекта.
Решение, к которому я пришел, было:
- Использовать один базовый класс для всех моих тестовых классов (что, к счастью, я уже делал)
- Переопределить
dataToString()
вмой базовый тестовый класс для проверки объектов такого типа в массиве данных (что возможно в моем случае, потому что я знаю, как эти объекты выглядят).Если объект присутствует, я возвращаю какое-то специальное значение, если нет, я просто передаю его родительскому методу.