【问题标题】:symfony simple-phpunit error 'You have requested a non-existent service "test.client"' only in deployment scriptsymfony simple-phpunit 错误'您请求了一个不存在的服务“test.client”'仅在部署脚本中
【发布时间】:2018-12-05 18:28:54
【问题描述】:

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');

【问题讨论】:

    标签: php symfony phpunit php-7.2 symfony-flex


    【解决方案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)后才开始遇到这个问题。

    【讨论】:

    • 你能给出一个代码示例,说明在你的环境元素中添加force="true" 是什么样的吗?不确定我是否在跟踪,因为我从未见过这个。谢谢
    • @Jordan,对不起,我看到这个迟到了,但是 之前&lt;env name="SYMFONY_PHPUNIT_VERSION" value="7.5" /&gt; 之后 &lt;env force="true" name="SYMFONY_PHPUNIT_VERSION" value="7.5" /&gt;(来自 phpunit.xml)
    猜你喜欢
    • 2011-09-07
    • 2014-11-13
    • 2016-05-04
    • 2013-02-03
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多