Frage Warum unterscheidet sich Request :: root () in Laravel 5, wenn es während des phpunit-Tests aufgerufen wird?


Ich habe einen Test definiert, der die Erstellung eines Benutzers testet. Der Controller ist so eingestellt, dass er bei einem Fehler zurück auf die gleiche Seite umleitet App\Http\Requests\Request). Dies funktioniert korrekt, wenn Sie manuell in einen Browser klicken, aber während eines Tests fehlschlägt. Anstatt umgeleitet zu werden:

http://localhost/account/create

Der Test leitet zu (ohne einen Schrägstrich):

http://localhostaccount/create

Keine dieser URLs sind, was ich in der .htaccess oder in der $url Variable in der Konfiguration / app.php. Was ist (On OSX Yosemite):

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

Ich habe schließlich das Problem festgestellt, etwas mit dem Ergebnis zu tun zu haben Request::root() wird generiert. Wenn Sie dies außerhalb eines Tests aufrufen, wird der in .htaccess und $url. Innerhalb des Tests ergibt sich:

http://localhost

Welche Konfiguration muss geändert werden, damit diese Funktion in beiden Kontexten den richtigen Wert zurückgibt?

Ich sollte auch erwähnen, dass ich das mühsame Upgrade von Laravel 4 auf die aktuelle Version 5.0.27 vorgenommen habe.

****** UPDATE *******

Ich war in der Lage, eine akzeptable Lösung / Abhilfe für dieses Problem zu finden!

In Laravel 5 wurden FormRequests eingeführt, um den Umzug zu erleichtern Validierung Logik aus Controllern. Sobald eine Anfrage dem Controller zugeordnet wurde, wenn a FormRequest (oder nur Request) angegeben ist, wird dies ausgeführt, bevor die Controller-Aktion ausgeführt wird.

Dies FormRequest behandelt standardmäßig die Antwort, wenn die Validierung fehlschlägt. Es versucht, eine Umleitung basierend auf der Route zu erstellen, an die Sie die Formulardaten gesendet haben. In meinem Fall, möglicherweise in Verbindung mit einem Updatefehler von Laravel 4 auf 5, wurde diese Standardumleitung falsch erstellt. Das Laravel-System Code für die Behandlung der Antwort sieht so aus:

 /**
 * 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);
}

Beachten Sie, dass die zurückgegebene Weiterleitung NICHT mit dem Aufruf identisch ist Redirect::route('some_route'). Sie können überschreiben Dies response Funktion durch Einbeziehung use Response in deinem Request Klasse.

Nach dem Gebrauch Redirect::route() Um die Weiterleitung zu erstellen, wurde die Logik in meinen Tests mit den erwarteten Ergebnissen übergeben. Hier ist mein Anfragecode, der funktioniert hat:

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');
  }

}

Der wichtige Teil ist, dass ich Redirect :: route aufgerufen habe, anstatt den Standardantwortcode ausführen zu lassen.


11
2018-04-07 04:19


Ursprung


Antworten:


Überschreiben Sie die Antwortfunktion im FormRequest-Validierungshandler, um zu erzwingen, dass die Weiterleitung mit Redirect :: route ('named_route') erstellt wird, anstatt die Standardumleitung zuzulassen.


2
2018-05-16 19:51



Du musst dich ändern config/app.php Dateien url Wert. Standardwert ist http://localhost

Doc von config/app.php

Diese URL wird von der Konsole verwendet, um bei Verwendung des Artisan-Befehlszeilentools URLs ordnungsgemäß zu generieren. Sie sollten dies auf das Stammverzeichnis Ihrer Anwendung einstellen, damit es beim Ausführen von Artisan-Aufgaben verwendet wird.


0
2018-04-28 05:26



Ich weiß, das ist keine exakte Antwort auf Ihre Frage, da es so ist nicht ein Konfigurationsupdate, das das Problem löst. Aber ich hatte mit einem verwandten Problem zu kämpfen und dies scheint der einzige Beitrag im Internet zu sein, der sich mit etwas Ähnlichem beschäftigt - ich dachte, ich würde meine zwei Cent für jeden einsetzen, der eine andere Lösung haben möchte.

Bitte beachten Sie, dass ich im Moment Laravel 4.2 benutze, das könnte sich in Laravel 5 geändert haben (obwohl ich es bezweifle).

Sie können das angeben HTTP_HOST Header, wenn Sie einen Controller mit der Funktion testen:

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

Um die Kopfzeile anzugeben, die gerade zur Verfügung gestellt wurde $server Variable wie ein Array wie folgt:

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

Wenn ich das oben erwähnte tat, produzierte der Wert, der für mein produziert wurde Request::root() war http://testing.mydomain.com.

Ich weiß, dass dies kein Konfigurationsupdate ist, um Ihr Problem zu lösen, aber hoffentlich kann dies jemandem helfen, der mit einem halbbezogenen Problem zu kämpfen hat.


0
2018-05-04 20:34