php - symfony simple-phpunit 错误 'You have requested a non-existent service "test.client"' 仅在部署脚本中

标签 php symfony phpunit 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);

我的所有测试都失败了:

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

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

$dotenv = new Dotenv();
$dotenv->load('.env');

最佳答案

嗯,看起来我也被 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 服务无法被识别,因为它只能在测试环境中访问。显然这是新的 phpunit 功能。早期版本的 phpunit 默认情况下允许变量覆盖,这解释了为什么我在升级 PHP(以及随之而来的 phpunit)后才开始遇到此问题。

关于php - symfony simple-phpunit 错误 'You have requested a non-existent service "test.client"' 仅在部署脚本中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51052966/

相关文章:

php - 如何将 PHP 类定义放入包含文件中

php - memory_get_peak_usage() 与 "real usage"

symfony - 如何降低 NotFoundHttpException 的严重性?

symfony - PhpUnit 和 Symfony : Mock Service not working

php - 最后一个选择会提升表中的所有内容,而不仅仅是该行

php - IF EXISTS UPDATE ELSE INSERT 语法错误

symfony - 在 Symfony2 中如何将日期附加到 assetic 文件名

Symfony 2 重定向路由

php - 找不到 Symfony 4 phpunit 类 WebTestCase

php - require_once(PHP/CodeCoverage/Filter.php) : failed to open stream