2015-12-18 5 views
10

So ist es üblich, dass Fehler von Authentifizierung und CSRF beim Ausführen phpunit auftreten.So deaktivieren Sie ausgewählte Middleware in Laravel-Tests

So in der Testcase verwenden wir:

use WithoutMiddleware;

Das Problem dabei ist, dass, wenn das formular scheitern, es mit einer Flash-Nachricht und Alt Eingang kommt in der Regel zurück. Wir haben alle Middleware deaktiviert, so dass wir keinen Zugriff auf Input::old('username'); oder die Flash-Nachricht haben.

Darüber hinaus sind unsere Tests dieses gescheiterten Form Post zurückkehrt:

Caused by 
exception 'RuntimeException' with message 'Session store not set on request. 

Gibt es eine Möglichkeit, die Session-Middleware zu ermöglichen und alles andere deaktivieren.

+0

Sie können auch einen Blick auf diese https://github.com/laravel/internals/issues/506#issuecomment-291552399 – ira

Antwort

16

Der beste Weg, um dies zu tun, ist nicht mit der WithoutMiddleware Eigenschaft, sondern durch Ändern der Middleware, die Sie deaktivieren möchten. Wenn Sie beispielsweise die VerifyCsrfToken Middleware-Funktionalität in Ihren Tests deaktivieren möchten, können Sie Folgendes tun.

Innerhalb app/Http/Middleware/VerifyCsrfToken.php, fügen Sie eine handle Methode, die die APP_ENV zum Testen überprüft.

public function handle($request, Closure $next) 
{ 
    if (env('APP_ENV') === 'testing') { 
     return $next($request); 
    } 

    return parent::handle($request, $next); 
} 

Dies wird die handle Methode innerhalb von Illuminate\Foundation\Http\Middleware\VerifyCsrfToken außer Kraft setzen, um die Funktionalität vollständig zu deaktivieren.

+2

nette Lösung, einfach zu lesen und zu verstehen. btw, 'env ('APP_ENV')' kann durch 'app() -> env' ersetzt werden, was ein bisschen schöner ist :) –

+0

Vielen Dank. Wenn jemand versucht, die Handle-Methode VerifyCSRF außer Kraft zu setzen und ein Argument 2 vom Typ App \ Http \ Middleware \ Closure sein muss, überprüfen Sie diese [Antwort] (http://stackoverflow.com/questions/33121192/laravel- 5-1-prevent-csrf-mismatch-from-throwing-exception) – surfer190

+1

Auch das hilft: https://github.com/laravel/framework/pull/18673 – meysam

Verwandte Themen