php-http/mock-client 是 HTTPlug 生态的可选组件,需先安装 php-http/httplug 和适配器(如 guzzle6-adapter),再安装 mock-client;它不自动拦截请求,须显式注入并预设响应,且 PSR-7 实现必须统一以避免类型错误。

php-http/mock-client 不是独立库,而是 php-http/client-common 生态中的一个可选组件,必须配合 HTTPlug(即 php-http/httplug)抽象层使用。直接 composer require php-http/mock-client 会失败或装错包。
确认你用的是 HTTPlug 兼容的 HTTP 客户端
Mock 客户端本身不发请求,它只响应你主动调用的 sendRequest() —— 所以你得先有基于 HTTplug 的客户端实例(比如 php-http/curl-client 或 php-http/guzzle6-adapter),或者用 php-http/client-common 提供的 HttpClientBuilder。
- 如果你项目里还没引入 HTTPlug 抽象层,先装:
composer require php-http/httplug - 再选一个底层适配器,例如 Guzzle 6:
composer require php-http/guzzle6-adapter - 最后装 mock 客户端:
composer require php-http/mock-client
用 MockClient 预设响应并验证请求行为
它不自动拦截请求,你需要显式把 MockClient 实例传给被测代码(比如构造函数注入),或替换掉原本的客户端。常见错误是以为它像 WebMock 那样全局生效 —— 它不会。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 创建 mock 实例:
$mock = new \Http\Mock\Client(); - 预设响应:
$mock->addResponse(new \GuzzleHttp\Psr7\Response(200, [], 'ok'));(注意:响应类需与你实际使用的 PSR-7 实现一致,如guzzlehttp/psr7或slim/psr7) - 传给你的服务类:
$service = new MyApiClient($mock); - 调用方法后,检查是否触发了预期请求:
$mock->getRequests()返回请求列表,可断言 URL、method、body
注意 PSR-7 实现不匹配导致的 TypeError
如果项目用了 slim/psr7,但 mock 响应用的是 guzzlehttp/psr7\Response,调用 sendRequest() 时可能报错:Argument 1 passed to ... must be an instance of Psr\Http\Message\RequestInterface —— 实际是不同 PSR-7 实现间类型不兼容。
立即学习“PHP免费学习笔记(深入)”;
- 统一 PSR-7 实现:要么全用
guzzlehttp/psr7,要么全用slim/psr7,并在 mock 响应中用对应类 - 若无法统一,用
http-interop/http-factory-wrapper桥接,但更简单的方式是:在测试中只依赖接口,用工厂创建请求/响应(如Http\Factory\Guzzle\RequestFactory) -
MockClient::addResponse()接收的是Psr\Http\Message\ResponseInterface,但它的内部比较逻辑依赖具体实现,跨实现添加响应可能静默失败
真正麻烦的不是装包,而是让被测代码接受 mock 客户端、且所有 PSR-7 类型能对上。漏掉其中一环,MockClient 就只是个空壳。


















