Функциональные тесты Symfony 5 — переменные среды отсутствуют, getenv() возвращает false

Я переписывал один из своих проектов на 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 по этому поводу?

Я просмотрел документы, но не нашел ничего, что могло бы мне помочь (или просто пропустил). Кто-нибудь знает, что это может быть?

Честно говоря, ни одна из переменных ENV не присутствует, когда я использую getenv() в своих тестах. Даже стандартные, поставляемые с Symfony.

Я использую модуль Symfony PHP unit bridge и просто запускаю свои тесты следующим образом:

./bin/phpunit tests/Integration/Container/Controllers/ContainerControllerTest.php

Я почти уверен, что это как-то связано с моей настройкой - просто не знаю, что это может быть.




Ответы (1)


В Symfony 5 использование putenv в компоненте dotenv устарело. Вы должны использовать $_ENV или $_SERVER для доступа к переменным среды.

Вы можете найти PR здесь, если вас интересуют подробности.

person Philip Weinke    schedule 05.08.2020
comment
Это хорошее замечание, Филип. Хотя даже думал, что это устарело, оно все еще должно работать, но это не так. Я не был уверен, следует ли мне использовать $_SERVER или $_ENV, но похоже, что этот PR объясняет это довольно хорошо. Вот что я собираюсь сделать. Однако в нем также упоминается, что getenv() должен работать, так что, возможно, это ошибка. Кто знает. В любом случае, ваш ответ мне понятен. Спасибо чувак. - person Robert; 05.08.2020
comment
Да, должна быть возможность использовать getenv(), если для usePutenv установлено значение true. Я только что просмотрел проект Symfony 5.1, и сейчас по умолчанию определенно false. Изменение флага в вашем bootstrap.php должно помочь (что-то вроде (new Dotenv())->usePutenv(true)->bootEnv(dirname(__DIR__).'/.env');) - person Philip Weinke; 05.08.2020
comment
Я пробовал это до того, как это сработало частично, вроде как. Я решил не слишком углубляться в это, так как теперь у меня есть гораздо более простое и лучшее решение. - person Robert; 05.08.2020