В Laravel 5, почему Request :: root () отличается при вызове во время теста phpunit?

Я определил тест, который проверяет создание пользователя. Контроллер настроен на повторное перенаправление на ту же страницу при ошибке (с использованием проверки через сгенерированное App\Http\Requests\Request ). Это работает правильно при ручном нажатии в браузере, но сбой во время теста. Вместо перенаправления на:

 http://localhost/account/create 

Тест перенаправляется (отсутствует косая черта):

 http://localhostaccount/create 

Ни один из этих URL-адресов не является тем, что я установил в .htaccess или переменной $url в config / app.php. Что (на OSX Yosemite):

 http://~username/laravel_projects/projectname/public 

Я, наконец, определил проблему, чтобы иметь какое-то отношение к тому, как генерируется результат Request::root() . Выполнение вызова за пределами теста приводит к ожидаемому значению, определенному в .htaccess и $url . Внутри теста это приводит к:

 http://localhost 

Какую конфигурацию нужно изменить, чтобы вернуть эту функцию в правильное значение в обоих контекстах?

Следует также упомянуть, что я сделал мучительное обновление от Laravel 4 до текущей версии 5.0.27.

****** ОБНОВИТЬ *******

Я смог найти приемлемое решение / обходное решение этой проблемы!

В Laravel 5 были введены FormRequests, чтобы помочь вывести логику проверки из контроллеров. Когда запрос сопоставляется с контроллером, если FormRequest (или просто Request ), это выполняется до того, как нажать на действие контроллера.

Этот FormRequest по умолчанию обрабатывает ответ, если проверка не выполняется. Он пытается построить перенаправление на основе маршрута, на который вы отправили данные формы. В моем случае, возможно, связанный с ошибкой обновления мин от Laravel 4 до 5, это перенаправление по умолчанию было построено неправильно. Системный код Laravel для обработки ответа выглядит следующим образом:

  /** * Get the proper failed validation response for the request. * * @param array $errors * @return \Symfony\Component\HttpFoundation\Response */ public function response(array $errors) { if ($this->ajax() || $this->wantsJson()) { return new JsonResponse($errors, 422); } return $this->redirector->to($this->getRedirectUrl()) ->withInput($this->except($this->dontFlash)) ->withErrors($errors, $this->errorBag); } 

Обратите внимание, что возвращаемое перенаправление НЕ совпадает с вызовом Redirect::route('some_route') . Вы можете переопределить эту функцию response , включив в свой класс Request use Response .

После использования Redirect::route() для создания перенаправления логика в моих тестах прошла с ожидаемыми результатами. Вот мой код запроса, который работал:

 namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use App\Http\Requests\Request; use Response; class AccountRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'email' => 'required|max:50|email|unique:users', 'password' => 'required|min:6', 'password_confirmation' => 'required|same:password' ]; } public function response(array $errors){ return \Redirect::route('account_create'); } } 

Важная часть заключается в том, что я назвал Redirect :: route вместо того, чтобы разрешить выполнение кода ответа по умолчанию.

Переопределите функцию ответа в обработчике проверки FormRequest, чтобы принудительно перенаправить перенаправление с помощью Redirect :: route ('named_route') вместо разрешения перенаправления по умолчанию.

Вам нужно изменить значение url файла config/app.php . Значение по умолчанию: http://localhost

Doc из config/app.php

Этот URL-адрес используется консолью для правильного создания URL-адресов при использовании инструмента командной строки Artisan. Вы должны установить это в корневое приложение, чтобы оно использовалось при выполнении задач Artisan.

Я знаю, что это не точный ответ на ваш вопрос, так как это не обновление конфигурации, которое решает проблему. Но я боролся с связанной проблемой, и, похоже, это единственная запись в Интернете, в которой кто-то сталкивается с чем-то подобным – я думал, что поставил бы свои два цента для тех, кто хочет другого решения.

Обратите внимание, что я использую Laravel 4.2 на данный момент, так что это могло измениться в Laravel 5 (хотя я сомневаюсь).

Вы можете указать заголовок HTTP_HOST когда вы тестируете контроллер с помощью функции:

 $response = $this->call($method, $uri, $parameters, $files, $server, $content); 

Чтобы указать заголовок, просто $server переменную $server как массив:

 array('HTTP_HOST' => 'testing.mydomain.com'); 

Когда я сделал это, значение, созданное для моего Request::root() было http://testing.mydomain.com .

Опять же, я знаю, что это не обновление конфигурации, чтобы решить проблему, но, надеюсь, это может помочь кому-то, кто борется с проблемой, связанной с полу.