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).

Другие вопросы по тегам