Symfony 5 功能测试 - 缺少环境变量,getenv() 返回 false
Posted
技术标签:
【中文标题】Symfony 5 功能测试 - 缺少环境变量,getenv() 返回 false【英文标题】:Symfony 5 Functional Tests - Environment Variables missing, getenv() returns false 【发布时间】:2020-11-25 22:49:45 【问题描述】:我正在将我的一个项目重写为 Symfony 5。我注意到 env 变量有些奇怪。我不能再像以前在功能测试中那样得到它们了。
没关系,但我有我的自定义 ApiTestCase
,它扩展了 Symfony 5 附带的现有测试用例。
在那里我正在做类似的事情(这不是关于我的应用程序的设计或流程的问题,只是关于如何获取变量的问题):
<?php
namespace App\Tests;
use App\Traits\Tools\Tests\Database\UsesTestDatabase;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
/**
* Class ApiTestCase
* @package App\Tests
*/
class ApiTestCase extends WebTestCase
/**
* ApiTestCase constructor.
*/
public function __construct()
parent::__construct();
dd(getenv('TEST_ENV_VARIABLE')) // should give me 'my secret env value'
# this is .env.test file
############################################################################################################
#
# GENERAL SETTINGS
#
############################################################################################################
KERNEL_CLASS='App\Kernel'
APP_ENV=test
############################################################################################################
#
# TEST DATABASE CONFIGURATION
#
############################################################################################################
TEST_ENV_VARIABLE='my secret env value'
TEST_ENV_VARIABLE
返回为假。总是。如果我把它放在.env.test
或phpunit.xml.dist
或我将指向的任何其他文件中都没关系。总是以false
的形式返回。
有趣的是——我在 Symfony 4 中没有这个问题。我正在查看我的旧代码,getenv()
可以正常工作。
我做了一些调查,在config/bootstrap.php
文件中,我用于测试 ENV 的所有变量都在$_SERVER
中可见,但由于某种原因它们从未被拖入 ENV。 Symfony 5 在这方面有什么不同吗?
我查看了文档,但没有看到任何可以帮助我的东西(或者我只是错过了它)。有谁知道那可能是什么?
说实话,当我在测试中使用 getenv()
时,没有任何 ENV 变量存在。甚至是 Symfony 附带的默认设置。
我正在使用 Symfony PHP unit bridge thingy,然后像这样运行我的测试:
./bin/phpunit tests/Integration/Container/Controllers/ContainerControllerTest.php
我几乎可以肯定这与我的设置有关 - 只是不确定它可能是什么。
【问题讨论】:
【参考方案1】:在 Symfony 5 中,在 dotenv 组件中不推荐使用 putenv。您必须使用$_ENV
或$_SERVER
来访问环境变量。
如果您有兴趣了解更多详情,可以找到 PR here
【讨论】:
说得好,菲利普。 Hower 甚至认为它已被弃用,它应该仍然可以工作,但它没有。我不确定是否应该使用$_SERVER
或$_ENV
,但看起来这个 PR 解释得很好。这就是我要做的。但是,它还提到getenv()
应该可以工作,所以它可能是一个错误。谁知道。无论如何,你的回答对我来说很有意义。谢谢,伙计。
是的,如果 usePutenv
设置为 true,应该可以使用 getenv()
。我刚刚看了一个 Symfony 5.1 项目,现在默认肯定是false
。更改 bootstrap.php
中的标志应该可以解决问题(类似于 (new Dotenv())->usePutenv(true)->bootEnv(dirname(__DIR__).'/.env');
)
我确实在它部分工作之前尝试过,有点。我决定不考虑太多,因为我现在有一个更简单、更好的解决方案。以上是关于Symfony 5 功能测试 - 缺少环境变量,getenv() 返回 false的主要内容,如果未能解决你的问题,请参考以下文章
Symfony3 不读取 Elastic Beanstalk 上的环境变量
如何在 Symfony4 结构的参数文件中检索我的环境变量?