2017-10-30 15 views
1

コントローラのテスト中に認証を完全にスキップする組み込みの方法はありますか?Laravelアプリケーションの機能テスト中に認証をスキップ

サンプルコントローラ:私はSMTを追加したくない

public function boot(GateContract $gate) 
{ 
    $gate->define('change-password', function ($user) { 
     // Some complex logic here 
    }); 
} 

public function changePassword(Request $request, LdapInterface $ldap) 
{ 
    $this->authorize('change-password'); 

    $this->validate($request, [ 
     'pass' => 'min:8|confirmed|weakpass|required', 
    ]); 

    $success = $ldap->updatePassword($request->get('pass')); 

    $message = $success ? 
     'Your e-mail password has been successfully changed' : 
     'An error occured while trying to change your alumni e-mail password.'; 

    return response()->json(['message' => $message]); 
} 

私のようなAuthServiceProvider内で定義されてchange-passwordルールを、スキップしたいです。コードの中にif (env('APP_ENV') == 'testing') return;のように。

答えて

0

私は気づいていませんが、そのチェックを専用のミドルウェアに移して、withoutMiddlewareの特性をテストで無効にすることができます。

また、Mockeryを使用してアプリケーションのゲートインスタンスをモックできます。嘲笑はよく、私はより多くの詳細については、ドキュメントを読んでお勧めしたいので、文書化されているが、それを設定すると、このようになります。

$mock = Mockery::mock('Illuminate\Contracts\Auth\Access\Gate'); 
$mock->shouldReceive('authorize')->with('change-password')->once()->andReturn(true); 
$this->app->instance('Illuminate\Contracts\Auth\Access\Gate', $mock); 

これは、ゲート契約のモックを設定し、それを受け取ることを期待するもの設定しますどのように応答する必要があるのか​​、それをアプリケーションに注入します。 laravel documentationから

0

:あなたのアプリケーションをテストするとき、あなたはそれが便利なあなたのテストのいくつかのために のミドルウェアを無効にするかもしれません

。これにより、 のルートとコントローラをミドルウェアの懸念事項から分離してテストすることができます。

use Illuminate\Foundation\Testing\WithoutMiddleware; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 

class ExampleTest extends TestCase 
{ 
    use WithoutMiddleware; 

    // 
} 

それとも、このようにメソッドをテストするには、あなたがwithoutMiddleware()メソッドを使用することができます: Laravelはあなたが に使用できる簡単なWithoutMiddleware形質が自動的にテストクラスのすべてのミドルウェアを無効に含ま

public function testBasicExample() 
{ 
    $this->withoutMiddleware(); 

    $this->visit('/') 
     ->see('Laravel 5'); 
} 

Ps:以降Laravel 5.1

+0

。 OPは、それをミドルウェアに移して、その特性が何らかの使用になるようにする必要があります –

0

実際には組み込みの方法があります。

\Gate::before(function() { 
     return true; 
    }); 

あなたは、あなたのテストのsetUp()方法か、すべてのテストメソッドのいずれかにこのスニペットを追加する必要があります:あなたは、コールバックは、実際の認可チェックの前に呼ばれるように「前」とtrueを返すことによって、単純にチェックを回避追加することができます承認を基準にしたい

0

はるかに簡単です。 ルートファイルの許可必須セクションから取り出してください。 は、この例では、私は認証なしで動作するようにAssignmentsControllerを必要なので、私はちょうどまでjwt.authグループからそれを移動:このチェックは、コントローラではなく、ミドルウェアである

Route::post('v1/auth/login', 'Api\[email protected]'); 
Route::post('v1/auth/sendpassword', 'Api\[email protected]'); 
Route::get('v1/assignments', 'Api\[email protected]'); 

Route::group(['middleware' => 'jwt.auth'], function() { 
    Route::post('v1/auth/logout', 'Api\[email protected]'); 
    Route::post('v1/shipments', 'Api\[email protected]'); 
    Route::post('v1/assignments/{id}/transfer', 'Api\[email protected]'); 
    Route::get('v1/shipments/assignments/{assignmentId}', 'Api\[email protected]'); 
    Route::post('v1/shipments/assignments/{id}/upload', 'Api\[email protected]'); 
}); 
関連する問題