Laravel Http facade部分Mock异常:模拟post/get时遇真实请求或方法不存在错误
解决Laravel Http Facade模拟时的真实请求与方法不存在问题
问题原因分析
你遇到的问题核心是同时混用了Laravel原生的Http::fake()和Mockery的partialMock(),以及对Http facade链式调用的模拟逻辑错误:
- 混用
Http::fake()与partialMock()会导致FakeFactory与Mockery实例冲突,最终fake失效触发真实请求; - 单独用
shouldReceive('post')时,没有模拟链式调用中的withHeaders()方法,Mockery无法识别未定义的方法。
解决方案1:使用Laravel原生Http::fake()(推荐)
Laravel提供的Http::fake()是专门用于模拟Http客户端的工具,完全可以满足你的需求,不需要额外使用Mockery的partialMock:
精确匹配URL与响应
// 模拟指定URL的POST请求,返回自定义响应 Http::fake([ 'fake-test-host/api/private/v1/target' => Http::response('tests', 200), // 其他所有请求默认返回空响应(可选) '*' => Http::response(), ]);
校验请求参数并返回响应
如果需要验证POST的请求数据是否匹配$this->defaultData,可以用回调函数:
Http::fake(function ($request) { if ($request->url() === 'fake-test-host/api/private/v1/target' && $request->method() === 'POST') { // 断言请求数据符合预期 $this->assertEquals($this->defaultData, $request->data()); return Http::response('tests', 200); } return Http::response(); });
解决方案2:正确使用Mockery Partial Mock
如果一定要用Mockery的partialMock,必须移除Http::fake(),同时要模拟链式调用中的withHeaders()方法(让它返回mock自身,保证链式调用能继续):
// 创建Http facade的partial mock $httpMock = Http::partialMock(); // 模拟withHeaders方法,返回mock自身以支持链式调用 $httpMock->shouldReceive('withHeaders') ->andReturnSelf(); // 模拟post方法,指定URL和请求数据 $httpMock->shouldReceive('post') ->with('fake-test-host/api/private/v1/target', $this->defaultData) ->once() ->andReturn('tests');
内容的提问来源于stack exchange,提问作者fudo
相关产品推荐
相关产品推荐

