#doctrine #phpunit #phpstorm #classloader
Вопрос:
У меня есть проект Laravel, для которого требуется PHPUnit >= 9.5, и он устанавливает двоичный файл PHPUnit как часть зависимостей композитора. Кроме того, PHPUnit устанавливается системой с версией 8.5.11 (я использую Gentoo). Итак, у меня есть
~/project-dir # /usr/bin/phpunit --version
PHPUnit 8.5.11 by Sebastian Bergmann and contributors.
~/project-dir # ./vendor/phpunit/phpunit/phpunit --version
PHPUnit 9.5.4 by Sebastian Bergmann and contributors.
В соответствии с этим класс PHP PHPUnitUtilLogTeamCity
и интерфейс PHPUnitTextUIResultPrinter
существуют дважды:
/usr/share/php/PHPUnit/Util/Log/TeamCity.php
/usr/share/php/PHPUnit/TextUI/ResultPrinter.php
./vendor/phpunit/phpunit/src/Util/Log/TeamCity.php
./vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php
Если я попытаюсь запустить PHPUnit из своей среды разработки, я получу следующую ошибку:
/usr/bin/php /var/www/localhost/lychee/vendor/phpunit/phpunit/phpunit --configuration /var/www/localhost/lychee/phpunit.xml --filter Tests\Feature\AlbumTest --test-suffix AlbumTest.php /var/www/localhost/lychee/tests/Feature --teamcity
Testing started at 13:05 ...
PHP Fatal error: Class PHPUnitUtilLogTeamCity cannot extend from interface PHPUnitTextUIResultPrinter in /usr/share/php/PHPUnit/Util/Log/TeamCity.php on line 378
Проблема довольно очевидна. Среда IDE вызывает более новую версию PHPUnit из установки Composer, но затем PHP пытается загрузить систему, предоставленную ResultPrinter
вместо использования класса, установленного Composer.
Моя IDE-PhpStorm.
Как мне решить эту проблему?
Комментарии:
1. Если уже используется правильный загрузчик композитора… то для меня это выглядит так, как будто к тому времени на неправильные классы PHPUnit уже ссылаются/известны PHP. попробуйте это: PHPUnit поддерживает файл начальной загрузки: посмотрите, выполняется ли этот файл (и когда). Если он работает нормально (это означало бы, что проблемные классы PHPUnit еще не загружены), затем используйте
get_declared_classes
и посмотрите, знает ли PHP эти классы PHPUnit к этому моменту или нет. если нет-возможно, есть другой загрузчик или он загружается с PHPinclude_path
-если да, попробуйте удалить оттуда этот глобальный путь PHPUnit.2. P.S. Как насчет полного удаления глобального PHPUnit? Никакой глобальной установки, никаких проблем с коллизиями версий. Если его невозможно удалить-как насчет обновления до той же версии, что и этот проект?
3. Помимо удаления, как уже предлагалось, мой вопрос будет заключаться в том, как/кто установил глобальную версию и для чего она требуется. Если он используется, это может быть так же просто, как обновить его. Если он не используется, возможно, разумно удалить его. И это только два заметных варианта, поэтому предоставление более подробной информации о конфигурации может помочь вам решить эту проблему прямым способом.
Ответ №1:
Вы должны выбрать локальный (относительно вашего проекта) PHPUnit… в конфигурации найдите путь и измените его на исполняемый файл PHPUnit вашего проекта…
Комментарии:
1. Проблема не в этом. Как вы также можете видеть из скопированной командной строки, среда IDE использует правильный исполняемый файл PHPUnit, правильный XML-файл конфигурации, а также правильный
Autoloader.php
файл, созданный Composer.2. Какую версию PHP вы используете ? Я думаю, что, возможно, в этом и проблема, так как все остальное выглядит правильно. Кроме того, попробуйте еще одну вещь, вместо того, чтобы иметь
"phpunit/phpunit": "^9.0"
или что-то подобное, попробуйте исправить версию до того9.5
, как, как я увидел, с ней возникли некоторые проблемы, попробуйте"phpunit/phpunit": "~9.4"
или даже9.3
посмотрите, будет ли она решена (не делайте^9.3
«но~9.3
«).