質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

Q&A

0回答

1093閲覧

PHPUnit | $model->save(); エラーケースのテストを書きたいです。この考え方(書き方)で合ってますか?

hiro..

総合スコア79

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHPUnit

PHPUnitは、PHP向けのユニット・テスト向けフレームワークで、手動では手間のかかるテスト作業を自動化し、繰り返し実行することが可能です。

0グッド

0クリップ

投稿2021/09/27 05:50

編集2021/09/28 06:05

大変お世話になっております。

phpunitの勉強を始めて日が浅い者です。
作成中のテストでうまくいかない部分があり、そもそもの考え方自体が合ってるのかどうか
心配になって質問させていただいた次第です。

Modelに作成したメソッド内で、save()が失敗した場合のテストを書きたいです。
(Mockery使用)

テストしたい対象のメソッドは以下のようになっています。

class Room extends Model { public function createRoom($uuid, int $userId) { DB::transaction(function () use ($uuid, $userId) { //Roomインスタンスを作成・保存 $room = $this->newInstance(); //略 $save = $room->save(); if ($save) { //Roomモデル保存成功したら $room = Room::where('uuid', $uuid)->first(); //Readモデルを2つ新規保存 //1つめ $read_1 = new Read; //略 $read_1->save(); //←-------ここでコケたらRoomがロールバックされるかをテストしたい //2つめ $read_2 = new Read; //略 $read_2->save(); } }); } }

メソッド内でsave()が複数回あり、2つめでコケた時に1つ目の$room->save()がロールバックされるか
をテストしたい場合

  • テスト対象メソッドはcreateRoom()
  • Readsave() をモック(返り値をエラーに設定)してテストする

↑ここまで合ってますでしょうか。

そのテストを書くにあたり、テストメソッドは

/** * @test */ public function createRoom_エラー() { //Readクラスのモック準備     $mock = \Mockery::mock(Read::class); $mock->shouldReceive('save') //saveメソッドが呼ばれて ->andThrow(new \Exception()); //例外を投げる     //対象メソッド実行     (new Room)->createRoom($uuid, $userId); //ロールバックされているかアサート $this->assertDatabaseHas('rooms', ..... }

このようなステップで組んで、DBに保存されていないことをアサートする、
という形で合ってますでしょうか。

ぼんやりとした質問ですみません、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問