Как переопределить переменные env в Laravel Dusk - PullRequest
0 голосов
/ 18 октября 2019

К сожалению, config(['key' => 'newValue']) не работает в настройках Dusk (для переопределения значения конфигурации), предположительно потому, что это изменит конфигурацию системы при запуске теста, а не опыт безголового браузеракоторый открывается для выполнения потока.

И иногда я не вижу возможности временно изменить значение env для определенного теста Dusk.

Например, временно установить QUEUE_DRIVER=sync, когда обычно это происходитэто 'dusk-connection', но в одном конкретном тесте мне нужно проверить значения в таблицах 'jobs' в БД.

Перед обновлением до Laravel> = 5.8 (и, следовательно, более новых версий DotEnv)Я мог использовать эту функцию, вызываемую в тесте Dusk, до $this->browse(...:

/**
 * Overrides any .env variables for Dusk tests. https://laracasts.com/discuss/channels/testing/how-to-change-env-variable-config-in-dusk-test 
 * The changes exist only for that one test because of tearDown.
 * Remember that you need to be using `php artisan dusk` instead of `phpunit`.
 * /11151225/laravel-dusk-kak-izmenit-znacheniya-konfiguratsii-pered-kazhdym-testom-dlya-brauzeracomment103224655_54407784
 *
 * @param array $variables
 */
protected function overrideDuskEnv($variables = []) {
    $path = self::DOT_ENV;
    if (file_exists($path)) {
        $contentToPrepend = '';
        foreach ($variables as $key => $value) {// Convert all new parameters to expected format
            $contentToPrepend .= $key . '="' . $value . '"' . PHP_EOL;
        }
        $originalFileContents = $this->envContents;
        $comment = '# ==============================================' . PHP_EOL . '# VARIABLES ABOVE THIS LINE are from "' . __FUNCTION__ . '" function in DuskTestCase ( https://laracasts.com/discuss/channels/testing/how-to-change-env-variable-config-in-dusk-test )' . PHP_EOL;
        file_put_contents($path, $contentToPrepend . $comment . $originalFileContents); //"If they are appended, it doesn't seem to take priority."
    } else {
        throw new \Exception('Could not find env file to override!');
    }
}

Я мог назвать ее так: $this->overrideDuskEnv(['QUEUE_DRIVER' => 'sync']);

Но в более позднем Laravelверсии, переменные окружения являются неизменяемыми (см. «Помощник по env для чтения» ).

Как мне достичь своей цели, где Dusk использует .env.dusk.local для большинства тестов, но затем для определенных тестовмможет немного отличаться?

1 Ответ

0 голосов
/ 20 октября 2019

Наконец, после 10+ часов борьбы с этой проблемой, у меня есть решение.

/**
 * @param array $variables
 */
protected function overrideDuskEnv($variables = []) {
    $path = self::DOT_ENV;
    if (file_exists($path)) {
        $contentToAppend = '';
        foreach ($variables as $key => $value) {// Convert all new parameters to expected format
            $contentToAppend .= $key . '="' . $value . '"' . PHP_EOL;
        }
        $originalFileContents = $this->envContents;
        $comment = '# ==============================================' . PHP_EOL . '# VARIABLES BELOW THIS LINE are from "' . __FUNCTION__ . '" function in DuskTestCase ( https://laracasts.com/discuss/channels/testing/how-to-change-env-variable-config-in-dusk-test )' . PHP_EOL;
        $this->baseCommand->consoleOutput('Appending to ' . $path . ': ' . $contentToAppend);
        file_put_contents($path, $originalFileContents . $comment . $contentToAppend); //It used to be the case that "If they are appended [rather than prepended], it doesn't seem to take priority", but after the DotEnv upgrade in Laravel 5.8, it seems prepending doesn't work and appending does.
    } else {
        throw new \Exception('Could not find env file to override!');
    }
}

Затем в моей функции setUp() в моем тестовом классе Dusk я вызываю:

    $this->overrideDuskEnv([
        'SIGNUP_FORM_POST_PATH' => \App\Helpers\Routes::SIGNUP,
        'QUEUE_DRIVER' => \App\Helpers\ConfigConstants::DUSK_CONNECTION
    ]);

Затем в каждой тестовой функции после закрытия $this->browse(function (Browser $browser)... и перед утверждениями я вызываю:

config(['queue.default' => \App\Helpers\ConfigConstants::DUSK_CONNECTION]); //this does not affect the headless browser but IS probably necessary here so that assertQueued knows to pull from the queue that the headless browser was using.

Сложно понять с помощью Dusk, что переменные окружения (и, следовательно, массивы конфигурации) консольного процесса, выполняющего тесты , отличаются от тех, которые используются браузером без монитора (имитирующим то, что будет испытывать реальный пользователь).

Кстати, яя очень надеялся на такие подходы, как этот , но они оказались полной тратой времени, потому что DuskCommand уже вызывает overload, чтобы сделать переменные env изменяемыми.

...