Laravel中需在database/factories/下定义模型工厂类,显式声明$model属性,definition()中用fake()生成数据并bcrypt加密密码;功能测试用RefreshDatabase Trait,调用factory()->create()生成数据并模拟用户行为断言。

你需要在 Laravel 项目中快速生成结构合理、可复用的测试数据,并用这些数据编写能真实模拟用户行为的功能测试用例,避免手动构造模型实例导致测试脆弱、难以维护。
定义模型工厂类
工厂类必须放在 database/factories/ 目录下,文件名需与模型名一致并以 Factory 结尾,例如 User 模型对应 UserFactory.php。
执行命令生成工厂类:php artisan make:factory UserFactory --model=User
打开生成的文件,确认类继承 Illuminate\Database\Eloquent\Factories\Factory,并在类中显式声明 protected $model = \App\Models\User::class; —— 这一步不可省略,Laravel 不再自动推断模型关联。
在 definition() 方法中返回字段数组,使用 fake()->name() 和 fake()->unique()->safeEmail() 生成自然数据;密码必须加密,写成 'password' => bcrypt('password'),否则登录测试会失败。
在功能测试中调用工厂生成数据
功能测试文件必须放在 tests/Feature/ 目录下,类需使用 use RefreshDatabase; Trait,确保每次测试前清空内存数据库。
第一步:在测试方法中调用 $user = User::factory()->create(); 创建已入库用户。
第二步:用 $this->post('/login', ['email' => $user->email, 'password' => 'password']) 提交表单。
第三步:断言重定向路径和认证状态:$response->assertRedirect('/dashboard'); → $this->assertAuthenticatedAs($user);
注意:若未启用 RefreshDatabase,上一次测试残留的用户可能干扰本次邮箱唯一性校验,导致 create() 报错。
批量生成与关联数据构造
方法一:生成 10 个用户并全部入库
直接写 User::factory()->count(10)->create();
方法二:为每个用户生成 3 篇文章
用 User::factory()->has(Post::factory()->count(3))->create(); —— 这会自动设置外键,无需手动赋值 user_id。
方法三:只生成模型实例不入库(适合单元测试)$user = User::factory()->make(['name' => 'Test User']); —— 此时 $user->id 为 null,且不会触发模型事件。
用工厂状态定制测试场景
在 UserFactory 类中添加状态方法:public function admin() { return $this->state(['is_admin' => true]); }
测试中链式调用:User::factory()->admin()->create();
可组合多个状态:User::factory()->admin()->verified()->create(); —— 前提是每个状态方法都返回 $this->state([...])。
带参数的状态更灵活:public function titled($title) { return $this->state(['title' => $title]); }
调用时写 Post::factory()->titled('Urgent Bug Fix')->create();


















