В 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, чтобы помочь переместить validation логику из контроллеров. Когда запрос сопоставляется с контроллером, если указан FormRequest (или просто Request), это выполняется до нажатия на действие контроллера.

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

 /**
 * 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, включив use Response в свой Request класс.

После использования 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 вместо того, чтобы разрешить выполнение кода ответа по умолчанию.

Ответ 1

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

Ответ 2

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

Doc из config/app.php

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

Ответ 3

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

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

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

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

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

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

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

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