2016-08-07 4 views
20

私が望むシナリオを手動でテストしました。Laravelで承認リダイレクトをテストするにはどうすればよいですか?

管理者は、サイトの/codesセクションにアクセスできます。 通常のユーザーは/dashboardにリダイレクトされ(302)、/qrに行くとメッセージSorry you are not allowed thereが返されます。

手動テストは合格ですが、ラベールテストは失敗します。

私はadminユーザーのlaravel 5.1

テスト使用しています:通常のユーザーのための

public function testAdminViewCodes() 
    { 
     //create an admin user 
     $user = factory(App\User::class, 'admin')->create(); 

     $this->actingAs($user) 
      ->visit('/codes') 
      ->seePageIs('/codes') 
      ->see('Codes'); 
    } 

テスト:

public function testNormalViewCodesFail() 
    { 
     //create a normal user 
     $normal_user = factory(App\User::class)->create(); 

     //TODO: Fix this failing test FFS 

     $this->actingAs($normal_user) 
      ->visit('/qr') 
      ->seePageIs('/dashboard') 
      ->see('Sorry you are not allowed there'); 
} 

テスト結果を。この質問は、しかし、別のpertanent問題があるどのくらいのため

$factory->define(App\User::class, function (Faker\Generator $faker) { 
    return [ 
     'email' => $faker->email, 
     'password' => bcrypt(str_random(10)), 
     'remember_token' => str_random(10), 
     'is_admin' => false, 
    ]; 
}); 

$factory->defineAs(App\User::class, 'admin', function ($faker) use ($factory) { 
    $user = $factory->raw(App\User::class); 

    return array_merge($user, ['is_admin' => true]); 
}); 

私の謝罪:私は工場に問題があるかもしれないと思う

There was 1 failure: 

1) AdminTest::testNormalViewQRCodesFail 
Did not land on expected page [http://localhost/dashboard]. 

Failed asserting that two strings are equal. 
--- Expected 
+++ Actual 
@@ @@ 
-'http://localhost/dashboard' 
+'http://localhost/codes' 

は、常に管理者ユーザーを作成しているようです。ミドルウェアは無視され

Route::group(['middleware' => ['auth', 'isadmin']], function() 
{ 
    Route::resource('user', 'UserController'); 
}); 

:?

Kernel.php
<?php 

namespace RMS\Http\Middleware; 

use Closure; 

class IsAdminMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (app()->env === 'testing') { 
      return $next($request); 
     } 

     if (! $request->user()->isAdmin()) { 
      return redirect()->route('dashboard') 
       ->with('message', 'Sorry you are not allowed there'); 
     } 

     return $next($request); 
    } 
} 

protected $routeMiddleware = [ 
     'auth' => \RMS\Http\Middleware\Authenticate::class, 
     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
     'guest' => \RMS\Http\Middleware\RedirectIfAuthenticated::class, 
     'isadmin' => \RMS\Http\Middleware\IsAdminMiddleware::class, 
    ]; 

とルートに適用され、私は、ユーザーが管理者であるかどうかをテストするためにmiddlewareを使用していますか私はuse WithoutMiddleware;ステートメントを追加してはいけません。

答えて

6

のために次の2つのオプションがあります。

  • を、それはあなたが持つ
  • 休憩をしたいユーザータイプを作ることができるよう、より良い、ユーザーの工場のためのテストを作成手動で検査するためのユーザ生成後のデバッガ

私はテストを作成することをお勧めします。あなたは今疑いがありますが、将来は間違いの可能性がありますそれはあまり明らかではないので、工場コードを壊してしまいます。

+0

'手動で検査するためにユーザ生成の後にデバッガで壊れます。'どのようにこれを行うのですか? Pythonには 'pdb()'や 'ipdb()'というクールなツールがあり、laravelに相当するものはありますか? – surfer190

+0

PHP用のデバッガは、[XDebug](https://xdebug.org/)と呼ばれています。いくつかのIDEには、例えば[PHPStorm](https://www.jetbrains.com/help/phpstorm/2016.2/configuring-xdebug.html)などの統合サポートがあります。 –

+0

ええ、それはあなたが解釈の途中で点検することはできません...それとも? – surfer190

3

詳細については、ユーザインスタンスの認証Auth::login($user);を使用してください。hereをお読みください。

この方法が有効であるLaravel 5.xおよびアップ

+0

ああ、それは 'laravel 5.2'です。私は' laravel 5.1'にあったと言いました。アップグレードはあまりにも多すぎたようだ。 – surfer190

+0

このメソッドは5.1でも同様に有効ですhttps://laravel.com/docs/5.1/authentication#other-authentication-methods –

+0

これは既に実行していますが、私は 'actingAs'ヘルパーメソッドhttps: /laravel.com/docs/5.1/testing#sessions-and-authentication – surfer190

4

脇に:unit testsは、user experienceのテストを意味しません。それはacceptanceまたはfunctionalのテストです。そのためのより一般的なツールの1つはcodeceptionです。phantomjsまたはseleniumと組み合わせると、ブラウザセッションをエミュレートし、完全なユーザーエクスペリエンスレンダリングを得ることができます。 http://codeception.com/docs/01-Introductionドキュメントで入手可能なドキュメント毎の

受け入れはをテスト:「受け入れテストは、ユーザーの視点から標準が、複雑なシナリオをカバーすることができます。受け入れテストでは、定義されたすべてのシナリオに従うと、エラーが発生しないという確信が得られます。

機能テスト: '機能テストでは、Webリクエスト($ _GETおよび$ _POST変数)をエミュレートし、HTML応答を返すアプリケーションに送信します。 '

ユニットテスト:'それらを結合する前にコードをテストすることも非常に重要です。このようにして、深く隠された機能が、機能テストや受入れテストではカバーされていなくても、機能することを確認できます。これはまた、安定したテスト可能なコードを作成したことを証明します。

+0

ユニットテストではありませんが、Laravel [built-it testing tools](https://laravel.com/docs/5.2/testing)の助けを借りて機能テストを行っています。 –

+0

明確にするため、質問タイトルを更新してください。 TIA –

+0

@Pheageyあなたの答えにさまざまな種類のテストの定義を書いて、信頼できるリソースにリンクしてください。ウィキペディアはそれをカットしません。 「単位」、「機能」、「統合」、「エンド・ツー・エンド」のテストであれば、私が明らかになるとすぐに問題を変更する予定です。これは答えですか、それとも脇見/コメントですか? – surfer190

関連する問題