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

升级PHPUnit9.5.10后Guzzle模拟响应getBody返回字符串报类型错误

报错根因

你使用的guzzlehttp/psr7 2.1.0版本严格遵循PSR-7规范,GuzzleHttp\Psr7\Response::getBody()方法的返回值强制声明为Psr\Http\Message\StreamInterface接口实例,你之前测试代码中直接模拟该方法返回JSON字符串的写法不符合接口类型约束,升级PHPUnit 9.x后严格的返回值类型校验触发了报错。
你的业务代码$data = json_decode($response->getBody());无需修改,因为StreamInterface实现了__toString()方法,直接传入字符串处理函数时会自动转换为响应体字符串。

解决方案

选择以下任意一种方式修改测试代码即可:

  • 直接用Guzzle官方提供的工具类将字符串转为符合要求的Stream实例,这是最推荐的写法:
// 引入工具类
use GuzzleHttp\Psr7\Utils;

// 模拟getBody方法返回Stream实例,替换原有直接返回字符串的写法
$mockResponse->method('getBody')
    ->willReturn(Utils::streamFor(json_encode(['your' => 'response data'])));
  • 单独模拟StreamInterface对象适配旧写法:
// 先构造模拟的Stream对象
$mockStream = $this->createMock(\Psr\Http\Message\StreamInterface::class);
$mockStream->method('__toString')->willReturn(json_encode(['your' => 'response data']));
// 让getBody返回模拟的Stream对象
$mockResponse->method('getBody')->willReturn($mockStream);
  • 如果你使用Guzzle自带的MockHandler做测试桩,直接传入原生Response对象即可,内部会自动处理响应体转换:
use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;

$mockHandler = new MockHandler([
    // 第三个参数直接传入响应内容字符串,无需手动转Stream
    new Response(200, [], json_encode(['your' => 'response data']))
]);
$client = new Client([
    'handler' => HandlerStack::create($mockHandler)
]);

内容的提问来源于stack exchange,提问作者crmpicco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:39:02