本文详解为何 `assertjsonstructure` 会因密码字段失败,以及如何使用 `assertjson` 精确验证 api 响应结构与数据,确保测试既安全又可靠。
在 Laravel 的 API 测试中,正确选择断言方法不仅关乎测试通过与否,更涉及数据安全性与接口契约的严谨性。你遇到的错误:
Failed asserting that an array has the key 'password'.
根本原因在于:数据库中存储的是哈希后的密码(如 $2y$12$…),而 API 响应体(JSON)中不应包含明文密码字段——这既是安全最佳实践,也是 Laravel 资源(UserResource)默认行为的结果。
回顾你的控制器代码:
public function store(Request $request): UserResource
{
// ... 验证逻辑
$user = new User();
$user->fill($validated['data'])->saveOrFail();
return new UserResource($user); // ← 关键:UserResource 决定返回哪些字段
}
默认情况下,UserResource 通常不会包含 password 字段(除非显式添加)。因此,当你调用:
->assertJsonStructure(['data' => ['name', 'email', 'password']])
Laravel 会严格检查响应 JSON 中 data 对象是否 存在且可访问 password 键——但实际响应中该键并不存在,故断言失败。