Laravel功能测试中如何匹配JSON响应的动态_token值
Laravel接口测试中处理动态JSON字段的断言方法
在Laravel Feature Testing里,遇到像_token这种动态生成的随机字段时,没法直接写死值断言,你可以用下面几种实用方法解决:
方法一:用AssertableJson闭包(推荐,Laravel 8+支持)
这种写法既可以断言固定字段的具体值,又能灵活验证动态字段的存在性和类型,代码结构清晰:
use Illuminate\Testing\Fluent\AssertableJson; $response->assertStatus(200) ->assertJson(fn (AssertableJson $json) => $json ->where('message', 'OTP verified successfully') ->where('phone', '+12312322334') ->where('route', 'dashboard') ->where('id', 9) ->has('_token') // 确认_token字段存在 ->whereType('_token', 'string') // 确认是字符串类型,按需可加长度等额外验证 );
方法二:提取响应数据后单独断言
如果需要对动态字段做更复杂的验证(比如校验token长度、格式),可以先取出响应的JSON数据,再分别验证:
$response->assertStatus(200); // 获取响应的JSON数组 $jsonData = $response->json(); // 断言固定字段的值 $this->assertEquals('OTP verified successfully', $jsonData['message']); $this->assertEquals('+12312322334', $jsonData['phone']); $this->assertEquals('dashboard', $jsonData['route']); $this->assertEquals(9, $jsonData['id']); // 验证动态_token的规则 $this->assertArrayHasKey('_token', $jsonData); // 字段存在 $this->assertIsString($jsonData['_token']); // 是字符串类型 $this->assertGreaterThanOrEqual(16, strlen($jsonData['_token'])); // 示例:验证长度至少16位
方法三:先断言结构再验证固定字段
如果只关心响应的字段结构完整,以及固定字段的值正确,不需要验证动态字段的类型,可以先断言JSON结构,再验证固定值:
$response->assertStatus(200) // 先确认所有必要字段都存在 ->assertJsonStructure([ 'message', 'phone', 'route', '_token', 'id' ]) // 再断言固定字段的具体值,忽略_token的内容 ->assertJson([ 'message' => 'OTP verified successfully', 'phone' => '+12312322334', 'route' => 'dashboard', 'id' => 9 ]);
内容的提问来源于stack exchange,提问作者nick coder
相关产品推荐
相关产品推荐

