💡

[Laravel] Factoryインスタンスをrawメソッドでarray化する

2024/06/28に公開

v11.13.0で確認

概要

src/Illuminate/Database/Eloquent/Factories/Factory.phprawメソッドを使うことで、Factoryインスタンスをarrayに変換できる

tinker環境での実行結果

> User::factory()->raw()
= [
    "name" => "Eriberto VonRueden",
    "email" => "ewald.rohan@example.net",
    "email_verified_at" => Illuminate\Support\Carbon @1719567621 {#5159
      date: 2024-06-28 09:40:21.073085 UTC (+00:00),
    },
    "password" => "$2y$12$QEkCfgXOl48S.MYQ1dOF0em5/oJlkqsJKogSb481y6/.CwC4DztBG",
    "remember_token" => "zFC6MFUMVZ",
  ]
> User::factory()->raw(['name' => null])
= [
    "name" => null,
    "email" => "ophelia.leffler@example.net",
    "email_verified_at" => Illuminate\Support\Carbon @1719567639 {#5100
      date: 2024-06-28 09:40:39.185384 UTC (+00:00),
    },
    "password" => "$2y$12$QEkCfgXOl48S.MYQ1dOF0em5/oJlkqsJKogSb481y6/.CwC4DztBG",
    "remember_token" => "6JifJ3aRNI",
  ]

rawメソッドの使いどころ

POST/PUT/PATCHのテストで、リクエストボディをarrayで用意してリクエストする時に使えそうです。

rawメソッドを使わない場合

    test('requires a name', function () {
        $attributes = [
            "name" => null,
            "email" => "test@example.com",
            "password" => "Password1234#"
        ];

        $this->post('/register', $attributes)->assertInvalid();
    });

rawメソッドを使った場合

    test('requires a name', function () {
        $attributes = User::factory()->raw(['name' => null]);

        $this->post('/register', $attributes)->assertInvalid();
    });

所感

rawメソッドを使うことでテストデータを手動で定義しなくて済み、より簡潔にテストが書けそうです。
Factoryで生成されるattributeが想定外の値にならないように気をつけつつ、使っていきたいと思います。

参考

以下のLaracastsを見ていて知りました。
https://laracasts.com/series/jeffreys-larabits/episodes/39

rawメソッドの実装
https://github.com/laravel/framework/blob/b8fa13289a2aca09a57e19e9ec840660eccd6b7d/src/Illuminate/Database/Eloquent/Factories/Factory.php#L195-L211

Discussion