2016-09-26 1 views
5

Ich versuche einige Grundeinheitstests für meine Laravel-Anwendung mit PHPUnit auszuführen.Laravel: PHPUnit verursacht 404s für alles

Alle HTTP-Anfragen geben jedoch einen 404 nicht gefundenen HTTP-Statuscode zurück, so dass wir bei der ersten Hürde versagen.

Nach dem Internet-Schleppen, ich habe Informationen zu finden, wie diese zu beheben, aber bisher keiner von ihnen tatsächlich funktionieren:

  • Überprüfung ich richtig die benannte Route verwiesen haben.
  • Überprüfen, ob diese Route über eine Controller-Methode verfügt.
  • Überprüfen, dass es im Browser funktioniert.
  • Ich habe dafür gesorgt, dass meine Anwendung URL korrekt in den richtigen Stellen gesetzt: TestCase::$baseUrl, Config->app->url ... Sein Satz http://localhost/myappfolder
  • Ich habe verschiedene Methoden versucht, aus meiner Einheit Testmethoden eine HTTP-Antwort zu erhalten Objekt. Soweit ergeben sich alle eine 404: $this->route(), $this->action(), $this->call().
  • Ich habe versucht, alle Referenzen zu Route Protection Middleware von meinen Controllern entfernen. Ich glaube, dass es beim Ausführen von Komponententests deaktiviert ist, aber ich habe dies getan, während ich mein sprichwörtliches Haar herausziehe, um dieses Problem zu diagnostizieren. Kein Effekt.
  • Die Roots-Datei meiner Anwendung hat mehrere PHP require s, die kleinere Routendateien enthält. Taylor Otwell hat zuvor gesagt, dass eine solche Routes-Datei, die require_once enthält, diese 404-Fehler verursachen kann. Er schlägt vor, zu require zu wechseln. Einige Entwickler berichten, dass dies für sie behebt, aber meine waren gerade require die ganze Zeit. Ich habe auch versucht, Routen in die Hauptrouten-Datei zurück zu verschieben, aber das hat auch nicht funktioniert.

Untersuchungen wurden in der Regel ungewöhnlich:

  • Wenn ich die route() Methode innerhalb Illuminate\Foundation\Testing\Concerns bearbeiten aus der URL drucken es erzeugt, ist es in der Tat perfekt geformt: http://localhost/myprojectfolder/route-url-text. Der Besuch dieser Seite im Browser funktioniert einwandfrei. Der Besuch mit cURL funktioniert auch. Das Ausführen von $this->call() für die URL, die generiert wurde, und dann Ausführen von PHPUnit zeigt das 404 wieder. Also ist es nur PHPUnit etwas seltsam zu tun.

Hier ist der Code, den ich in dem Unit-Test-Skript:

public function testThis() 
{ 
    $response = $this->route('GET', 'myRouteName', [ 
     'myParam' => 5 
    ]); 
    dd($response->status()); // 404 - always! 
} 

Es ist wie es ist etwas in und wirft Schritt ist ausdrücklich ein 404 ... schätzen würde wirklich, wenn jemand beleuchten könnte darauf.

+0

Das wird seltsam erscheinen, aber was passiert, wenn Sie direkt danach eine andere Route anrufen? Hast du 200? Ich hatte ein ähnliches Problem in der Vergangenheit, aber fand nie eine Lösung – Aron

+0

Das scheint seltsam ... aber ich schätze den Vorschlag. Ich habe ein paar Anfragen hintereinander gestellt. Immer noch die 404. – kohloth

+0

Ah Entschuldigung, ich kann nicht mehr helfen. Es kann sich lohnen, dieses Thema auch im Laracasts-Forum zu veröffentlichen – Aron

Antwort

1

Problem gelöst. Ich hatte dies innerhalb app/Providers/AppServiceProvider.php. Etwas, das dem Sammel-Fehlerbehebungsleitfaden für PHP hinzugefügt werden kann!

public function boot() 
{ 
    URL::forceRootUrl(Config::get('app.url')); 
} 

Ich habe dies geändert:

public function boot() 
{ 
    if (!defined('PHPUNIT_RUNNING')) { 
     URL::forceRootUrl(Config::get('app.url')); 
    } 
} 

Und dieses Insite phpunit.xml

<php> 
    <const name="PHPUNIT_RUNNING" value="true"/> 
</php> 
1

Laravel5.5 (Verkäufer/Laravel/Rahmen/src/Illuminate/Stiftung/Testing setzen/Bedenken/MachtHttpRequests.php)

public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null) 
{ 
    $kernel = $this->app->make(HttpKernel::class); 
    $files = array_merge($files, $this->extractFilesFromDataArray($parameters)); 
    $symfonyRequest = SymfonyRequest::create(
     $this->prepareUrlForRequest($uri), $method, $parameters, 
     $cookies, $files, array_replace($this->serverVariables, $server), $content 
    ); 
    $response = $kernel->handle(
     $request = Request::createFromBase($symfonyRequest) 
    ); 
    if ($this->followRedirects) { 
     $response = $this->followRedirects($response); 
    } 
    $kernel->terminate($request, $response); 

    return $this->createTestResponse($response); 
} 

Es ist offensichtlich, dass der Laravel nicht die Anforderung an Fern senden:

$response = $kernel->handle(
    $request = Request::createFromBase($symfonyRequest) 
); 

Sie co Täuschung verwenden sollten.