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

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

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

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

Q&A

解決済

1回答

3000閲覧

PHPUnit $this->expectException()と$this->assertDatabaseHas は共存できない?

hiro..

総合スコア79

PHPUnit

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

0グッド

0クリップ

投稿2021/10/01 05:44

いつもお世話になっております。

PHPUnitを学習しております。

  • 例外が発生する
  • 保存失敗でDBがロールバックされる

ことを期待するテストで以下のように書いた場合

/** * @test */ public function 例外時はDBがロールバックする() { $this->expectException(\Exception::class); $this->expectExceptionMessage('Duplicate entry'); //メソッド実行 $this->sut->テストしたいメソッド();            //ここが実行される前にテストが終了 $this->assertDatabaseMissing('rooms', [ 'uuid' => $uuid, ]); }

テスト冒頭に

$this->expectException(\Exception::class);

を使用すると最後のAssertまで進む前にテストが終わってしまい、

逆に

$this->expectException(\Exception::class);

を書かないとエラーが出てテストが落ちてしまいます。
エラー自体は期待した動きなのですが、それでテストが落ちてしまうので困っております。

$this->expectException(\Exception::class);
だけだと例外が出ていることを確認するだけなので、assertDatabaseも同時に確認したいのですが
2つのメソッドは共存できないのでしょうか。

ドキュメントを確認してもそういった記述が無かったため、どなたか知見のある方ご教示いただけますと嬉しいです。

何卒よろしくお願いいたします。

環境
PHPUnit 8.5.8

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

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

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

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

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

guest

回答1

0

自己解決

stackOverflowに回答がありました。

https://stackoverflow.com/questions/5683592/phpunit-assert-that-an-exception-was-thrown

上記サイトにたくさんコメントがついていますが、私が今回取り入れたのは

  • $this->expectException() を使わない
  • テストメソッドを try catch してcatch内でエラーアサートする

です。

投稿2021/10/02 23:57

hiro..

総合スコア79

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問