Наконец, после 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 изменяемыми.