2015-12-18 8 views
10

Quindi è normale che si verifichino errori di autenticazione e CSRF durante l'esecuzione di phpunit.Come disattivare il middleware selezionato nei test Laravel

Così nel TestCase usiamo:

use WithoutMiddleware;

Il problema di questo è che quando le forme non riescono, di solito torna con un messaggio flash e Old ingresso. Abbiamo disabilitato tutto il middleware quindi non abbiamo accesso a Input::old('username'); o al messaggio flash.

Inoltre i nostri test di questo fallito forma pubblicare dichiarazioni:

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

C'è un modo per attivare il Middleware Session e disabilitare tutto il resto.

+0

Si consiglia inoltre di dare un'occhiata a questa https://github.com/laravel/internals/issues/506#issuecomment-291552399 – ira

risposta

16

Il modo migliore che ho trovato per fare questo non è utilizzando il tratto WithoutMiddleware ma modificando il middleware che si desidera disabilitare. Ad esempio, se si desidera disabilitare la funzionalità middleware VerifyCsrfToken nei test, è possibile eseguire quanto segue.

All'interno app/Http/Middleware/VerifyCsrfToken.php, aggiungiamo un metodo handle che controlla la APP_ENV per il test.

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

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

questo modo viene ignorato il metodo handle interno Illuminate\Foundation\Http\Middleware\VerifyCsrfToken, disabilitando la funzionalità del tutto.

+2

bella soluzione, facile da leggere e capire. btw, 'env ('APP_ENV')' può essere sostituito con 'app() -> env', che è un po 'più bello :) –

+0

Grazie. Se qualcuno sta cercando di sovrascrivere il metodo di handle di VerifyCSRF e ottieni un 'Argument 2 deve essere di tipo App \ Http \ Middleware \ Closure', controlla questa [risposta] (http://stackoverflow.com/questions/33121192/laravel- 5-1-prevenire-csrf-mismatch-from-throwing-exception) – surfer190

+1

Anche questo aiuta: https://github.com/laravel/framework/pull/18673 – meysam

Problemi correlati