Laravel数据库测试:如何保证更新时假数据与数据库一致?
解决方案
你的测试失败主要有几个关键原因,对应修正方法如下:
1. 修复管理员用户赋值错误
原代码中$admin = $this->user->attachRole('admin');是错误的——attachRole()方法返回的是布尔值(表示角色关联是否成功),而非用户模型实例。actingAs()需要传入用户实例,否则请求会因权限问题无法执行更新操作。
修正:
public function test_user_update() { // 给用户附加管理员角色 $this->user->attachRole('admin'); // 直接使用原用户实例作为认证用户 $response = $this->actingAs($this->user)->putJson(route('user.update', ['user' => $this->user->id]), $fake); // ... 其他代码 }
2. 确保模型可填充字段配置正确
如果User模型的$fillable数组没有包含name、city、date,Laravel的批量赋值机制会忽略这些字段,导致更新的数据无法存入数据库。
在User模型中补充可填充字段:
class User extends Model { protected $fillable = ['name', 'city', 'date']; // 可根据实际需求补充其他字段 }
3. 修正路由参数
如果你的更新路由定义为Route::put('/user/{user}', [UserController::class, 'update']),路由参数应该是user而非update。原代码中的['update' => $this->user->id]会导致控制器无法定位到要更新的用户,更新操作不生效。
修正路由参数:
$response = $this->actingAs($this->user)->putJson(route('user.update', ['user' => $this->user->id]), $fake);
4. 确认假数据不会重复生成(可选)
你担心的“每次调用fake()生成新数据”在当前代码中不会发生——当你把fake()->name赋值给$fake['name']时,已经生成了固定的字符串值,后续访问$fake['name']不会重新生成。如果需要更明确地固定假数据,可以提前单独生成:
$name = fake()->name; $city = fake()->city; $date = fake()->date; $fake = [ 'name' => $name, 'city' => $city, 'date' => $date ];
修正后的完整测试代码
public function test_user_update() { $this->user->attachRole('admin'); $fake = [ 'name' => fake()->name, 'city' => fake()->city, 'date' => fake()->date ]; $response = $this->actingAs($this->user)->putJson(route('user.update', ['user' => $this->user->id]), $fake); $this->assertDatabaseHas(User::class, $fake); }
内容的提问来源于stack exchange,提问作者perh22
相关产品推荐
相关产品推荐

