簡體   English   中英

symfony simple-phpunit錯誤“您僅在部署腳本中請求了不存在的服務“ 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

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環境未設置為“測試”有關。 我的phpunit.xml使用正確的值:

<env name="APP_ENV" value="test" />

瘋狂的是,當我自己(以MY-USER)運行時,單元測試運行得很好。 當我以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來運行APP_ENV=test ,這將導致無法識別test.client服務,因為該服務只能在test環境中訪問。 顯然,這是新的phpunit功能。 早期版本的phpunit默認情況下將允許覆蓋變量,這解釋了為什么我僅在升級PHP(以及phpunit)之后才開始遇到此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM