symfony simple-phpunit错误“您已请求部署脚本中不存在的服务“ test.client””

946*_*857 2 php phpunit symfony php-7.2 symfony-flex

的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);
Run Code Online (Sandbox Code Playgroud)

我所有的测试都失败了:

You have requested a non-existent service "test.client"
Run Code Online (Sandbox Code Playgroud)

关于此错误有很多SO问题,并且与phpunit环境未设置为“测试”有关。我的phpunit.xml使用正确的值:

<env name="APP_ENV" value="test" />
Run Code Online (Sandbox Code Playgroud)

疯狂的是,当我自己(以MY-USER)运行时,单元测试运行得很好。当我以root身份登录并执行时,它们甚至可以正常运行

runuser MY-USER -c 'bin/simple-phpunit'
Run Code Online (Sandbox Code Playgroud)

我做的时候他们甚至

$ sudo su
$ php -a
php > exec("runuser MY-USER -c 'bin/simple-phpunit'", $output, $returnCode);
Run Code Online (Sandbox Code Playgroud)

当我感到绝望并开始将变量转储到控制台时,似乎一切正常:

echo "ENV = " .getenv('APP_ENV');  // [OUTPUT BELOW]
Run Code Online (Sandbox Code Playgroud)
ENV = dev
Run Code Online (Sandbox Code Playgroud)
exec('bin/console debug:container test.client -e test', $output, $return);
var_dump(implode("\n", $output));  // [OUTPUT BELOW]
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
exec("runuser arderyp -c 'bin/simple-phpunit --debug'", $output, $return);
var_dump(implode("\n", $output));  // [OUTPUT BELOW]
Run Code Online (Sandbox Code Playgroud)
# 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".
Run Code Online (Sandbox Code Playgroud)

在运行测试之前,我使用symfony标准方法正确解析了.env:

$dotenv = new Dotenv();
$dotenv->load('.env');
Run Code Online (Sandbox Code Playgroud)

946*_*857 5

好吧,似乎我也对PHPUnit的这种变化感到有点受宠: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)之后才开始遇到此问题。