LaravelでPHPUnitを使ってCRUD処理のテストを自動化③【投稿の削除】

Laravelとテスト

LaravelでPHPUnitを使って、CRUD処理のテストを自動化させる方法を解説しています。

今回は、投稿の削除の処理のテストを書いていきます。投稿の削除は、投稿者本人と管理者のみが行えるようにします。

実際の開発の現場でも使えるよう、実践的なテストの作り方をご紹介していきますね。

本記事は、CRUD処理を使ってWebアプリ開発ができる方向けのものとなります。テストの前提となるWebアプリは既に開発済みのものとして、本記事では詳しく解説しません。

Webアプリの前提条件

Webアプリの前提条件や事前準備については、前回までの記事にて解説しています。

新規作成画面の表示と保存、編集、更新のテスト方法も解説しています。

PHPUnitの基本的な使い方を知りたい場合は、まずは下記記事をご覧ください。

事前準備:Gate(ゲート)の設定

今回は、投稿の削除は、投稿者本人と管理者のみが行えるものとします。

管理者かどうかは、usersテーブルのroleカラムに”admin”と入っているかどうかで判断するようにします。

この前提で、app/Providers/AuthServiceProvidersに、次のようにadminゲートを作っておきましょう。

【app/Providers/AuthServiceProviders】

このゲートを使うと、投稿者本人($user->id==$post->user_id))またはユーザーの役割がadmin($user->role==’admin’)であれば、return true として、処理を実行します。

コントローラの投稿の編集画面表示と更新のメソッドには、下記のように作成したadminゲートを設定しておきます。

【PostController】

CRUD処理のテスト:投稿の削除

投稿の削除のテストを作っていきましょう。

tests/Feature/PostTest.phpを開き、下記のようにコードを加えます。

【tests/Feature/PostTest.php】

コードの意味を解説します。

  • factoryを使って新規ユーザー($user)と新規投稿($post)を作成します。$postのuser_idは、$userのidとします。
  • このユーザーとして、投稿を削除します。その後、HTTPステータスが302であるかどうかを確認します。HTTPステータスが302であれば、リクエストが指定したURLにリダイレクトされた状態ということになります。また、$this->assertDatabaseMissingによって、
    $postのデータがデータベースから削除されていることも確認します。
  • 次に、もう一人ダミーユーザー($anotherUser)を作成します。新たに投稿($post2)を作成します。$post2のuser_idは、$anotherUserのidとします。
  • この状態で、最初のuserが投稿($post2) を削除しようとします。ですが、$post2のuser_idは、anotherUserのidであるため、削除できません。この時、HTTPステータスが403であるかどうかを確認します。HTTPステータスが403は、権限がないということになります。
  • 次に、管理者権限を持つダミーユーザー($adminUser)を作成します。新規投稿($post3)も作成します。$post3のuser_idは、$userのidとします。
  • この状態で、$adminUserが投稿($post3) を削除します。その後、HTTPステータスが302であるかどうかを確認します。HTTPステータスが302であれば、リクエストが指定したURLにリダイレクトされた状態ということになります。また、$this->assertDatabaseMissingによって、$post2のデータがデータベースから削除されていることも確認します。

これによって、自分が作った投稿を削除できるかテストしています。また、自分以外の人が作成した投稿を削除しようとすると、403エラーになるかどうかをテストしています。さらに、管理者であれば自分以外の人が作成した投稿を削除できるかテストしています。

コードを保存したら、下記コマンドを実行します。

無事にテスト通りに進んだ場合には、下記のように返ってきます。

データベースを確認すると、ユーザーが3人と投稿が1つ登録されています。確認してみてください。

さいごに

投稿の削除のテスト記述方法を解説しました。

また今回までで4回にわたり、LaravelでPHPUnitのテストを作るための方法をお伝えしてきました。

テストを書くのは正直メンドウですが、ただ一度書いてしまえば、時間が取られるテスト作業を自動化できます。

今後のWebアプリ開発を便利にするために、テストの自動化、よかったら試してみてくださいね。

なおテストではFactoryやSeederといったダミーデータの作成も重要になります。他のブログ記事でも解説しています。

また執筆した書籍「Laravelの教科書」の後半でも、ダミーデータの作り方を解説しています。

ご興味あれば、見てみてください。こちらのページでも、書籍についてご紹介しています。

Laravelとテスト

【Laravelの教科書・プレゼント】

Junko
Laravelの使い方を覚えたい!と思ったら、ぜひ、役立ててほしいです。 基礎編は無料でプレゼント中です♪
ひつじプログラマ
会員制サイトをいちから作っていくよ。ボタンをクリックして詳細を見てね。
Laravelの教科書の詳細を見る

最新のLaravel10版テキストに加え、Laravel8版・Laravel9版もご用意しています♪

【無料プレゼント】

「LaravelでWebアプリをいちから作れるようになりたい!」

そんなLaravel初心者のあなたへ【Laravelの教科書】基礎編プレゼント中! 会員制フォーラムサイトを学習しながら作れます。

詳細はこちらをクリック

最新のLaravel10版テキストに加え、Laravel8版・Laravel9版もご用意しています♪

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。
Laravel10対応。Laravel11サポートガイドもご用意しています。詳しくは下記ボタンをクリック♪

書籍の詳細を見てみる

Laravelの本を書きました。


ひつじが目印♪
クリックするとamazonページへ。

Laravel10対応

Laravelの使い方を分かりやすく解説した書籍を出版しました。書店やAmazon等のオンラインショップにて販売中です。

書籍の詳細を見てみる

 

Laravelの教科書限定コミュニティ【Laravelの教科書ラボ】はじめました。
デプロイ講座付。StripeやChatGPT連携など過去10回分のセミナー動画視聴可能。

Laravel実践スキルをのばしたい方におすすめです。

ラボの案内を見てみる

Twitter始めました。
40代からプログラミング!
タイトルとURLをコピーしました