Я использую Lumen 8. и я хочу использовать конфигурацию внутри .env.testing но он всегда читает конфигурацию внутри .env

< sizestests/TestCase.php

<?php

use Dotenv\Dotenv;

abstract class TestCase extends Tests\Utilities\UnitTest\Testing\TestCase
{

    public static function setUpBeforeClass(): void
    {
        Dotenv::createImmutable(dirname(__DIR__), '.env.testing')->load();
    
        parent::setUpBeforeClass();
    }
  
    public function createApplication()
    {
        return require __DIR__ . '/../bootstrap/app.php';
    }
}

< sizes.env.testing

APP_ENV=testing
APP_DEBUG=false

DB_CONNECTION=mysql
DB_HOST=db_testing
DB_PORT=3307
DB_DATABASE=db_testing
DB_USERNAME=db_username
DB_PASSWORD=db_password

< EM> .env

APP_ENV=local
APP_DEBUG=false

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3307
DB_DATABASE=db_local
DB_USERNAME=db_username
DB_PASSWORD=db_password

Когда я отлаживаю тестовый файл, например dd(DB::connection()->getDatabaseName()); он возвращает db_local вместо db_testing

Я не хочу добавлять всю свою конфигурацию внутрь phpunit.xml чего не хватает? Что я должен делать?

1
Kenneth 14 Янв 2021 в 07:02

2 ответа

Лучший ответ

Вы загружаете файл среды в новый экземпляр репозитория, но ваше приложение lumen не знает, что экземпляр репозитория существует.

Затем, когда ваш файл bootstrap/app.php запускается, он создает экземпляр репозитория, загруженный с вашим обычным файлом .env, который lumen знает, как использовать.

Самым чистым решением, вероятно, является удаление метода setUpBeforeClass() и просто обновление файла bootstrap/app.php для поддержки загрузки различных файлов .env.

Один пример:

$env = env('APP_ENV');
$file = '.env.'.$env;

// If the specific environment file doesn't exist, null out the $file variable.
if (!file_exists(dirname(__DIR__).'/'.$file)) {
    $file = null;
}

// Pass in the .env file to load. If no specific environment file
// should be loaded, the $file parameter should be null.
(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
    dirname(__DIR__),
    $file
))->bootstrap();

Если вы обновите файл bootstrap/app.php с помощью этого кода, тогда вы можете указать одну переменную среды в файле phpunit.xml, чтобы установить для переменной APP_ENV значение testing. Если вы это сделаете, приведенный выше код загрузит файл .env.testing.

NB: вся теория основана на чтении кода. непроверенный.

1
patricus 14 Янв 2021 в 04:49

Довольно интересно, что lumen не поддерживает имена динамических файлов среды после того, как они удалили поддержку artisan. Ссылка на Проблема

Так что в основном вам нужно перейти в ручной режим

В вашем файле bootstrap.app

// boostrap.php

(new Laravel\Lumen\Bootstrap\LoadEnvironmentVariables(
    \dirname(__DIR__),
))->bootstrap();
class LoadEnvironmentVariables
{
    protected $filePath;
    protected $fileName;

    // change the $name, i.e the env file name to your env file manually
    public function __construct($path, $name = null)
    {
        $this->filePath = $path;
        $this->fileName = $name;
    }
  ....

Вот еще одна ссылка, которая может помочь

1
Ashu 14 Янв 2021 в 04:39
65713265