Laravel 8にアップグレードして、testを実行したところfactoryのファイルが見つからないとエラーが出ました。
(ModelにHasFactoryは追加済)
Class 'Database\Factories\Infrastructure\Eloquents\Models\PostFactory' not found
実際ファイルは下記のように配置していたのでパスが一致してません。
Database\Factories\PostFactory
修正前PostFactory.php
<?php declare(strict_types=1);
// Factoriesの直下に配置
namespace Database\Factories;
use App\Infrastructure\Eloquents\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Post::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name'=> 'test'
];
}
}
エラーの該当箇所を見ると、AppかApp\Models以外にmodel.phpが置かれている場合にエラーになるようです。
今回のプロジェクトではInfrastructure\Eloquents\Models配下にModel類を置いているので今更変えるのは難しいです。
Factory.php
public static function resolveFactoryName(string $modelName)
{
$resolver = static::$factoryNameResolver ?: function (string $modelName) {
$modelName = Str::startsWith($modelName, 'App\\Models\\')
? Str::after($modelName, 'App\\Models\\')
: Str::after($modelName, 'App\\');
return static::$namespace.$modelName.'Factory';
};
return $resolver($modelName);
}
参考記事にあるようにDatabase\Factories配下にModelフォルダと同じフォルダ構成を作成すれば良さそう。
例
PostFactory.php
<?php declare(strict_types=1);
// PostModelの配置場所と同じ構成にする
namespace Database\Factories\Infrastructure\Eloquents\Models;
use App\Infrastructure\Eloquents\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = Post::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name'=> 'test'
];
}
}
無事テストが通過するようになりました!
参考記事
https://laracasts.com/discuss/channels/laravel/laravel-8-model-factory-namespaces