Как установить env для пользовательского загрузчика Symfony - PullRequest
1 голос
/ 04 мая 2019

Я использую Codeception для приемочных испытаний.Однако, поскольку мне нужно предварительно заполнить базу данных необходимыми сущностями, мне нужно ядро ​​Symfony.Я создал TestKernel:

class TestKernel extends KernelTestCase
{
    public static function boot(): ContainerInterface
    {
        $_ENV['KERNEL_CLASS'] = 'App\Kernel';
        $_ENV['APP_ENV'] = 'test';
        putenv('APP_ENV=test');
        require_once codecept_root_dir('config/bootstrap.php');
        static::bootKernel();
        return static::$container;
    }
}

Здесь я расширяю от Symfony\Bundle\FrameworkBundle\Test\KernelTestCase, как это используется в тестах phpunit.Мне также требуется config/bootstrap.php, как phpunit.xml.И я пытаюсь установить тестовый env, но пока он не работает.Я пробовал $_SERVER, $_ENV, putenv, но все они дают один и тот же результат: .env.dev загружается вместо .env.test.Не могу получить подсказку.При запуске APP_ENV=test ./vendor/bin/codecept run используется тестовый env.Я думал, что я должен быть в состоянии установить env в php.В любом случае phpunit делает это как-то.

Редактировать Я вижу, что это вызвало некоторую путаницу.Позвольте мне показать, как я использую TestKernel:

class PageCest {
    public function _before(AcceptanceTester $I)
    {
        $this->container = TestKernel::boot();
        $this->fixture->setContainer($this->container)->createProducts();
        $I->amOnPage('/my-page');
    }
}

Как вы видите, я создаю совершенно отдельный экземпляр Symfony в приемочном тесте (другого пути не вижу).

1 Ответ

1 голос
/ 05 мая 2019

Проблема связана с Codeception.Проблема заключалась в том, что Codeception самостоятельно загружал .env файлы.В codeception.yml есть ключ params:

params:
    - .env

, который загружает файлы env.На первый взгляд он делает то, что делает Symfony - загружает файл .env и загружает все производные файлы в соответствии со значением APP_ENV: если APP_ENV - dev - он загружает .env.dev.Но Codeception использует другую логику - он загружает только файл, но не загружает файлы окружения.В этом случае он загружает только параметры из .env, а не .env.dev.

Для ясности, Symfony и Codeception используют одинаковые пакеты для загрузчика файлов env: symfony/dotenv.В то время как Symfony использует #loadEnv, Codeception использует '# load`.И это объясняет разницу, о которой я говорю.

Учитывая все это, решение было довольно простым: добавить новый элемент в ключ params - '.env.test . In this case my TestKernel` будет выглядеть так:

class TestKernel extends KernelTestCase
{
    public static function boot(): ContainerInterface
    {
        $_ENV['KERNEL_CLASS'] = 'App\Kernel';
        static::bootKernel();
        return static::$container;
    }
}

И codeception.yml:

params:
    - .env
    - .env.test
...