Laravel功能测试中如何设置可被$request->getContent()读取的请求体
解决方案
你当前测试代码的第一个问题是使用了get方法发起请求,HTTP规范中GET请求通常不会携带请求体,你的接口如果是接收JSON数据,大概率是POST/PUT等请求方法,先调整请求方法。
Laravel功能测试不需要单独调用setBody/setContent方法,已经封装了直接传递请求体的能力,两种常用方案如下:
方案1:使用JSON请求方法(推荐)
Laravel提供的postJson/putJson/json方法会自动将数组参数序列化为JSON请求体,同时自动设置Content-Type: application/json请求头,后端通过$request->getContent()可以直接获取到完整的JSON字符串,示例代码:
public function testSuccessfullyProcessed() { // 构造要提交的业务数据,会自动转为JSON格式 $data = [ 'field1' => 'test value', 'field2' => 123 ]; // 对应POST请求接口,若为PUT请求则替换为putJson方法即可 $response = $this->postJson('/api/process', $data); $response->assertStatus(200); }
方案2:直接传递原始JSON字符串
如果你已经提前拼接好了原始JSON字符串,不需要Laravel帮你做数组转JSON的处理,可以使用底层的call方法,直接通过content参数传入请求体:
public function testSuccessfullyProcessed() { // 你的原始JSON字符串 $json = '{"field1":"test value","field2":123}'; $response = $this->call( method: 'POST', uri: '/api/process', content: $json ); $response->assertStatus(200); }
注意:如果你的接口确实需要用GET请求携带请求体(不符合HTTP标准规范,不推荐),只需要将上述代码中的
method参数改为GET即可。
内容的提问来源于stack exchange,提问作者Petar Vasilev
相关产品推荐
相关产品推荐

