💡
[Laravel] Factoryインスタンスをrawメソッドでarray化する
v11.13.0で確認
概要
src/Illuminate/Database/Eloquent/Factories/Factory.php
のraw
メソッドを使うことで、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を見ていて知りました。
raw
メソッドの実装
Discussion