2015-12-18 158 views
10

phpunitを実行すると、認証とCSRFのエラーが発生することがよくあります。Laravelテストで選択したミドルウェアを無効にする方法

だから、私たちが使用するテストケースで:

use WithoutMiddleware;

これに伴う問題は、フォームが失敗したとき、それは通常のフラッシュメッセージと旧入力して戻ってくるということです。 Input::old('username');またはフラッシュメッセージへのアクセス権がないようにすべてのミドルウェアを無効にしました。

さらに、この私たちのテストはフォームのポストリターンを失敗しました:

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

は、セッションミドルウェアを有効にし、他のすべてを無効にする方法はあります。

+0

また、このhttps://github.com/laravel/internals/issues/506#issuecomment-291552399 – ira

答えて

16

これを行うには、WithoutMiddlewareという特長を使用するのではなく、無効にするミドルウェアを変更する方法があります。たとえば、テストでVerifyCsrfTokenミドルウェア機能を無効にする場合は、次の操作を実行できます。

app/Http/Middleware/VerifyCsrfToken.phpの中には、APP_ENVをテストするためのhandleメソッドを追加します。

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

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

これは完全に機能を無効にする、Illuminate\Foundation\Http\Middleware\VerifyCsrfTokenの内部handleメソッドをオーバーライドします。

+2

で見ていただきたいと思います。わかりやすい解説です。 btw、 'env( 'APP_ENV')は' app() - > env'で置き換えることができます。これはちょっといいです:) –

+0

ありがとう。誰かがVerifyCSRFハンドルメソッドをオーバーライドしようとしているときに、 '引数2はApp \ Http \ Middleware \ Closure型である必要があります。この[answer](http://stackoverflow.com/questions/33121192/laravel- – surfer190

+1

これはまた、直接 'env( 'APP_ENV')'をチェックするのではなく、https://github.com/laravel/framework/pull/18673 – meysam

関連する問題