LaravelでPHPUnitを使って、CRUD処理のテストを自動化させる方法を解説します。
今回は投稿の編集画面の表示・投稿の更新のためのテストを書いていきます。
編集と更新は、投稿者本人のみが行えるようにします。権限がない人が処理を行うと、403エラーになります。こういった制限がかかるかどうかも、テストでチェックできるようにします。
実際の開発の現場でも使えるよう、実践的なテストの作り方をご紹介していきますね。
Webアプリの前提条件
Webアプリの前提条件や事前準備については、前回の記事にて解説しています。
新規作成画面の表示と保存のテスト方法も解説しています。もし前回記事をご覧頂いていない場合には、まずはこちらをご覧ください。
PHPUnitの基本的な使い方を知りたい場合は、まずは下記記事をご覧ください。
事前準備:Gate(ゲート)の設定
投稿の編集画面表示と更新は、投稿者本人のみが行えるものとします。
この制限を加えるために、app/Providers/AuthServiceProvidersに、次のようにpostゲートを設定しておきます。
【app/Providers/AuthServiceProviders】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; (省略) public function boot(): void { Gate::define('post', function ($user, $post) { if($user->id==$post->user_id) { return true; } return false; }); } |
コントローラの投稿の編集画面表示と更新のメソッドには、下記のようにpostゲートを設定しておきます。これによって、投稿者本人でなければ、編集・更新ができないよう制限がかかります。
【PostController】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function edit(Post $post) { $this->authorize('post', $post); (省略) } public function update(Request $request, Post $post) { $this->authorize('post', $post); (省略) } |
CRUD処理のテスト:投稿の編集ページ表示
投稿の編集ページを表示するためのテストを作っていきましょう。
tests/Feature/PostTest.phpを開き、下記のようにコードを加えます。
【tests/Feature/PostTest.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 投稿の編集ページ表示テスト(投稿者本人のみに表示) public function test_can_edit_post() { $user = User::factory()->create(); $post = Post::factory()->create(['user_id' => $user->id]); $response = $this->actingAs($user)->get('/post/' . $post->id . '/edit'); $response->assertStatus(200); $anotherUser = User::factory()->create(); $post->user_id = $anotherUser->id; $post->save(); $response = $this->actingAs($user)->get('/post/' . $post->id . '/edit'); $response->assertStatus(403); } |
コードの意味を解説します。
- factoryを使って新規ユーザー($user)と新規投稿($post)を作成します。$postのuser_idは、$userのidとします。
- このユーザーとして、投稿の編集ページを開きます。HTTPステータスが200であるかどうかを確認します。HTTPステータスが200であれば、リクエストが無事サーバーで受理された状態ということになります。
- 次に、もう一人ダミーユーザー($anotherUser)を作成します。先ほど作成した投稿($post)のuser_idは、anotherUserのidに変更します。これによって、$postの投稿者は$anotherUserとなります。
- この状態で、最初に作った$userが投稿の編集ページを開こうとします。ですが、$userは$postの投稿者ではないために、ページを開けないはずです。この時にHTTPステータスが403であるかどうかを確認します。HTTPステータスが403は、権限がないということになります。
これによって、自分が作った投稿を無事開けるかテストしています。さらに自分以外の人が作成したページを開こうとすると、403エラーになるかどうかをテストできます。
コードを保存したら、下記コマンドを実行します。
1 |
php artisan test |
無事にテスト通りに進んだ場合には、下記のように返ってきます。
データベースを確認すると、ユーザーが2人と投稿が1つ登録されています。確認してみてください。
CRUD処理のテスト:投稿の更新
引き続き、投稿の更新のテストを書いてみます。
【tests/Feature/PostTest.php】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// 投稿の更新テスト(投稿者本人のみに表示) public function test_can_update_post() { $user = User::factory()->create(); $post = Post::factory()->create(['user_id' => $user->id]); $response = $this->actingAs($user)->put('/post/'.$post->id, [ 'title' => '投稿の更新', 'body' => '投稿の更新をしました', ]); $response->assertStatus(302); $this->assertDatabaseHas('posts', [ 'title' => '投稿の更新', 'body' => '投稿の更新をしました', 'user_id' => $user->id, ]); $anotherUser = User::factory()->create(); $post->user_id = $anotherUser->id; $post->save(); $response = $this->actingAs($user)->put('/post/'.$post->id, [ 'title' => '投稿の更新', 'body' => '投稿の更新をしました', ]); $response->assertStatus(403); } |
コードの意味を解説します。
- factoryを使って新規ユーザー($user)と新規投稿($post)を作成します。$postのuser_idは、$userのidとします。
- このユーザーとして、投稿を更新します。その後、HTTPステータスが302であるかどうかを確認します。HTTPステータスが302であれば、リクエストが指定したURLにリダイレクトされた状態ということになります。
- $this->assertDatabaseHasによって、指定した条件に一致するデータがデータベース中に存在するかを確認しています。
- 次に、もう一人ダミーユーザー($anotherUser)を作成します。先ほど作成した投稿のuser_idは、anotherUserのidに変更します。これによって、$postの投稿者は$anotherUserとなります。
- この状態で、最初に作った$userが投稿($post) を更新しようとします。ですが、すでに$postのuser_idは、anotherUserのidに変わっているために、更新できません。この時、HTTPステータスが403であるかどうかを確認します。HTTPステータスが403は、権限がないということになります。
これによって、自分が作った投稿を更新できるかテストしています。さらに自分以外の人が作成したページを更新しようとすると、403エラーになるかどうかをテストしています。
コードを保存したら、下記コマンドを実行します。
1 |
php artisan test |
無事にテスト通りに進んだ場合には、下記のように返ってきます。
データベースを確認すると、今回もユーザーが2人と投稿が1つ登録されています。確認してみてください。
さいごに
以上、投稿の編集と更新のためのテストコードを解説しました。
次回は、削除処理について、PHPUnitでどのようにテストを行うか解説していきます。
次回は「投稿者と管理者以外はエラーになる」というテストコードを入れていきます。
引き続きPHPUnitを実践的に使っていきましょう♪
なお「LaravelでCRUD処理を作る方法を実践的に学びたい」と思ったら、学習サイト【Laravelの教科書】をご活用ください。
こちらは、Laravelの使い方を学びつつ、CRUD処理をどんどん使って、実際のフォーラムサイトを作成していく教材です。
【Laravelの教科書を通じて作成するWebアプリのサンプルページ】
基礎編は無料です♪
詳細は、上記ボタンをクリックして案内ページを見てみてくださいね。