如何在 Laravel 中测试 Http Pool?
Posted
技术标签:
【中文标题】如何在 Laravel 中测试 Http Pool?【英文标题】:How to test Http Pool in Laravel? 【发布时间】:2021-09-12 12:33:23 【问题描述】:我有这个类,它使用Http::Pool 将数据推送到多个 url。
class Pusher()
public function __construct($data, $headers)
$this->data = $data;
$this->headers = $headers;
public function pushToAddresses()
$addresses = get_address_somewhere_here();
$responses = Http::pool(fn (Pool $pool) => $addresses->map(fn ($address) => $this->pushData($pool, $address)));
public function pushData(Pool $pool, $address)
return $pool->withHeaders($this->headers)
->withBody($this->data, 'application/json')
->post($address->url);
问题:如何模拟Pool
,以便我可以测试withHeaders
、withBody
、post
是否使用正确的数据正确调用?
类似:
$mockPool = \Mockery::mock(Pool::class);
$mockPool->shouldReceive('withHeaders')->once()->with(['header1', 'header2']);
$mockPool->shouldReceive('withBody')->once()->with('body here...', 'application/json');
$mockPool->shouldReceive('post')->once()->with('address url here...');
【问题讨论】:
Http::Pool 来自 Laravel 基础库,无需测试。库有责任对其进行测试,您只需使用它并期望它能够工作。 【参考方案1】:我对 Guzzle 模拟的经验(Laravels http 是一个 guzzle 包装器),创建存根响应然后模拟它是否更容易。 Laravel
对此有一个方法,否则请参阅doc。你不会保证输入是正确的,但这是务实的方法。
Http::fake([
'address/url/1' => Http::response(['your response' => 'data'], 201, ['Headers']),
'address/url/2' => Http::response(['your response' => 'data'], 201, ['Headers']),
]);
一般来说,模拟从来没有真正测试过它的工作原理,因为你的模拟是你定义的功能,而不是 api 的。我们的主和救世主曾说过这句名言。我不完全同意它,我主要是为了测试执行的方便而嘲笑它。
【讨论】:
以上是关于如何在 Laravel 中测试 Http Pool?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 中使用内存数据库的完整测试套件之前迁移和播种?
在 Laravel 测试用例中模拟一个 http 请求并解析路由参数