大変お世話になっております。
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()
Read
のsave()
をモック(返り値をエラーに設定)してテストする
↑ここまで合ってますでしょうか。
そのテストを書くにあたり、テストメソッドは
/** * @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に保存されていないことをアサートする、
という形で合ってますでしょうか。
ぼんやりとした質問ですみません、よろしくお願いいたします。
あなたの回答
tips
プレビュー