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.testphpunit.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())-&gt;usePutenv(true)-&gt;bootEnv(dirname(__DIR__).'/.env'); 我确实在它部分工作之前尝试过,有点。我决定不考虑太多,因为我现在有一个更简单、更好的解决方案。

以上是关于Symfony 5 功能测试 - 缺少环境变量,getenv() 返回 false的主要内容,如果未能解决你的问题,请参考以下文章

如果缺少环境变量,则 Gatsby 构建失败

Symfony 4控制台命令不读取环境变量

Symfony3 不读取 Elastic Beanstalk 上的环境变量

如何在 Symfony4 结构的参数文件中检索我的环境变量?

在功能测试中使用全局变量(使用 Symfony 和 Codeception)

Symfony2 - ...\Entity\Users 类型的实体缺少字段“userId”的分配 ID