Laravel6.xからLaravel7.xにアップグレードし、PHPUnitを動かすとエラー。モデルファクトリの挙動が変わったよう。
公式に載ってないやつかな?と思ったらどうやらサラッと書いてあったこちら、Factoryタイプ機能削除に関連していたみたい。
Laravel6までは
// ファクトリの記述
$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => factory(App\User::class),
'hoge' => 'hoge',
];
}, 'hoge');
第三引数に文字列をセットできていました。
// モデルの保存
$post = factory(App\Post::class, 'hoge')->create();
そして保存時に第二引数にファクトリに記述した文字列を渡すことで、hogeの配列が保存されます。
この機能がLaravel7から廃止されたため、使えなくなりました。代替としてファクトリステートを使います。
// ファクトリの記述
$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => factory(App\User::class),
];
});
// ファクトリステート
$factory->state(App\Post::class, 'hoge', [
'hoge' => 'hoge',
]);
ファクトリステートを記述しておくと、呼び出し側(保存時)でstate('hoge')を呼び出すとデフォルトの配列に['hoge' => 'hoge']というレコードを追加した配列が作成できます。
// モデルの保存
$post = factory(App\Post::class)->state('hoge')->create();
以上、Laravel7へのアップグレードでハマった件でした。ファクトリタイプ機能は2016年10月からドキュメントに記載していません、とのことだったので油断していました。ガッツリ使用していたので大きめの修正になりました。
Factoryタイプについて調べても全然記事が出てこなかったのでこちらに備忘録として残しておきます。
この件がFactoryタイプで合っているのかもわかりません。