symfony simple-phpunit 错误 'You have requested a non-existent service "test.client"' 仅在部署脚本中
symfony simple-phpunit error 'You have requested a non-existent service "test.client"' only in deployment script
PHP: 7.2.7
SYMFONY:3.4.12
PHP单元桥:4.1.1(php单元 6.5.8)
我有一个用 PHP 编写的部署脚本,运行 是 root 用户,自从从 7.0 升级到 php 7.2 并相应地更新我的代码后,它已经开始运行 进行 php 单元测试时莫名其妙地失败。我敢肯定我在这里有错,但经过许多小时的调试后我一无所获,希望有人能够指出我正确的方向。
脚本 运行 以 root 用户身份执行以下操作:
exec("runuser MY-USER -c 'bin/simple-phpunit'", $output, $returnCode);
我所有的测试都失败了:
You have requested a non-existent service "test.client"
关于此错误有很多 SO 问题,它与未设置为 "test" 的 php 单元环境有关。我的 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".
在 运行 进行测试之前,我使用 symfony 标准方法正确解析了我的 .env:
$dotenv = new Dotenv();
$dotenv->load('.env');
嗯,看起来我也被PHP单位的这个变化所困扰:https://github.com/sebastianbergmann/phpunit/issues/2353
将 force="true"
属性添加到我的所有 env
元素解决了这个问题。
这里的问题是我在进入这个 phpunit 步骤之前加载(通过 Dotenv
)我的本地 .env
文件。如果没有上面提到的 force
属性,phpunit.xml
中的环境变量不会覆盖 .env
中已经设置的环境变量。因此,测试是 运行 和 APP_ENV=dev
而不是 APP_ENV=test
,这导致无法识别 test.client
服务,因为它只能在 test
环境中访问.显然这是新的 phpunit
功能。 phpunit
的早期版本默认允许变量覆盖,这解释了为什么我在升级 PHP(以及随之而来的 phpunit)后才开始遇到这个问题。
PHP: 7.2.7
SYMFONY:3.4.12
PHP单元桥:4.1.1(php单元 6.5.8)
我有一个用 PHP 编写的部署脚本,运行 是 root 用户,自从从 7.0 升级到 php 7.2 并相应地更新我的代码后,它已经开始运行 进行 php 单元测试时莫名其妙地失败。我敢肯定我在这里有错,但经过许多小时的调试后我一无所获,希望有人能够指出我正确的方向。
脚本 运行 以 root 用户身份执行以下操作:
exec("runuser MY-USER -c 'bin/simple-phpunit'", $output, $returnCode);
我所有的测试都失败了:
You have requested a non-existent service "test.client"
关于此错误有很多 SO 问题,它与未设置为 "test" 的 php 单元环境有关。我的 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".
在 运行 进行测试之前,我使用 symfony 标准方法正确解析了我的 .env:
$dotenv = new Dotenv();
$dotenv->load('.env');
嗯,看起来我也被PHP单位的这个变化所困扰:https://github.com/sebastianbergmann/phpunit/issues/2353
将 force="true"
属性添加到我的所有 env
元素解决了这个问题。
这里的问题是我在进入这个 phpunit 步骤之前加载(通过 Dotenv
)我的本地 .env
文件。如果没有上面提到的 force
属性,phpunit.xml
中的环境变量不会覆盖 .env
中已经设置的环境变量。因此,测试是 运行 和 APP_ENV=dev
而不是 APP_ENV=test
,这导致无法识别 test.client
服务,因为它只能在 test
环境中访问.显然这是新的 phpunit
功能。 phpunit
的早期版本默认允许变量覆盖,这解释了为什么我在升级 PHP(以及随之而来的 phpunit)后才开始遇到这个问题。