You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:00:42