ひでメモ

プログラムについて勉強したことを書きます。たぶん。

【Laravel】assertDatabaseHas のテーブル名の取得をモデルから行ったほうが可読性が上がる気がする

テストで下記のようにデータベースの中身を確認するパターンよくあると思います。

$this->assertDatabaseHas(
         'm_user',   // テーブル名を文字列で指定
        [
            'id'       => $user->id,
            'user_name'  => $user->user_name,
        ]);

ただ、テーブル名を文字列で指定するのってなんか冗長だなぁと思っていました。
たまにモデル名と一致してなかったりするし、わざわざ Model のクラスまで見に行くのめんどくさいし…

そこで、以下のようにテーブル名をモデルから取得するように書いたほうがわかりやすいのではと。

$this->assertDatabaseHas(
        User::getModel()->getTable(),   // テーブル名をモデルから取得
        [
            'id'       => $user->id,
            'user_name'  => $user->user_name,
        ]);

メリットとしては以下のようなものがあるかと思います。

  • どのモデルがテスト対象になっているか明らか
  • IDE でのサジェストが効く ※テーブル名もサジェストしてくれる IDE もあるとは思いますがモデルよりは少ないと思います

デメリットとしては以下くらいかなと思います。

  • テーブル名を取得する処理を挟んでるので処理負荷は(テーブル名直指定よりは)高い
  • 記述が長くなる?

ただ、処理負荷としてはテスト用ファクトリでモデルつくるのと比べたら誤差なのでほぼこじつけみたいなものかなと思います。