symfony simple-phpunit error 'Вы запросили несуществующую службу "test.client" "только в сценарии развертывания
PHP: 7.2.7
SYMFONY: 3.4.12
PHPUNIT-BRIDGE: 4.1.1 (phpunit 6.5.8)
У меня есть скрипт развертывания, написанный на PHP, который запускается от имени пользователя root, и, начиная с версии 7.0 до php 7.2 и обновляя мой код соответствующим образом, он начал необъяснимо проваливаться при выполнении тестов phpunit. Я уверен, что здесь я виноват, но после многих часов отладки я ничего не получил и надеюсь, что кто-то сможет указать мне правильное направление.
Сценарий запускается от имени пользователя root и при этом выполняет следующее:
exec("runuser MY-USER -c 'bin/simple-phpunit'", $output, $returnCode);
Все мои тесты терпят неудачу с:
You have requested a non-existent service "test.client"
Есть много проблем SO с этой ошибкой, и это связано с тем, что среда phpunit не установлена на "test". Мой phpunit.xml использует правильное значение:
<env name="APP_ENV" value="test" />
Сумасшедшая часть заключается в том, что модульные тесты работают нормально, когда я запускаю их сам (как МОЙ ПОЛЬЗОВАТЕЛЬ). Они даже работают правильно, когда я вхожу в систему как root и выполняю
runuser MY-USER -c 'bin/simple-phpunit'
Они даже бегут, когда я делаю
$ sudo su
$ php -a
php > exec("runuser MY-USER -c 'bin/simple-phpunit'", $output, $returnCode);
И когда я впал в отчаяние и начал выводить переменные в консоль, кажется, что все правильно:
echo "ENV = " .getenv('APP_ENV'); // [OUTPUT BELOW]
ENV = dev
exec('bin/console debug:container test.client -e test', $output, $return);
var_dump(implode("\n", $output)); // [OUTPUT BELOW]
Information for Service "test.client"
=====================================
---------------- ---------------------------------------
Option Value
---------------- ---------------------------------------
Service ID test.client
Class Symfony\Bundle\FrameworkBundle\Client
Tags -
Public yes
Synthetic no
Lazy no
Shared no
Abstract no
Autowired no
Autoconfigured no
exec("runuser arderyp -c 'bin/simple-phpunit --debug'", $output, $return);
var_dump(implode("\n", $output)); // [OUTPUT BELOW]
# Everything fails in the same fashion as below
8) App\Tests\Authentication\Security\SomeTest::testSomething
Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException: You have requested a non-existent service "test.client".
Перед запуском тестов я правильно анализирую свой.env, используя стандартный подход Symfony:
$dotenv = new Dotenv();
$dotenv->load('.env');
1 ответ
Ну, похоже, меня тоже немного поразило это изменение в PHPUnit: https://github.com/sebastianbergmann/phpunit/issues/2353
Добавление force="true"
приписать всем моим env
элементы решили проблему.
Проблема в том, что я загружаюсь (через Dotenv
) мой местный .env
файл, прежде чем перейти к этому шагу phpunit. Без force
атрибут, упомянутый выше, переменные среды в phpunit.xml
не переопределяют те, которые уже установлены .env
, Следовательно, тесты выполняются с APP_ENV=dev
вместо APP_ENV=test
, который вызывает test.client
услуга не будет признана, потому что она доступна только в test
среда. Видимо это новое phpunit
функциональность. Ранние версии phpunit
позволит переопределить переменную по умолчанию, что объясняет, почему я начал испытывать эту проблему только после обновления PHP (и вместе с ним, phpunit).