symfony simple-phpunit error 'Вы запросили несуществующую службу "test.client" "только в сценарии развертывания - PullRequest
0 голосов
/ 27 июня 2018

PHP: 7.2.7

SYMFONY: 3.4.12

PHPUNIT-BRIDGE: 4.1.1 (phpunit 6.5.8)


У меня есть сценарий развертывания, написанный на PHP, который запускается от имени пользователя root и, начиная с обновления до php 7.2 с 7.0 и соответственно обновляя мой код, он начал необъяснимым образом давать сбой при выполнении тестов 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 Ответ

0 голосов
/ 27 июня 2018

Ну, похоже, меня тоже поразило это изменение в 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).

...