php - 如何在 Laravel 中测试 Http Pool?
问题描述
我有这个类,它使用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...');
解决方案
我对 Guzzle 模拟的经验(Laravels http 是一个 guzzle 包装器),创建存根响应然后模拟它是否更容易。Laravel
有一个方法,否则请参阅文档。你不会保证输入是正确的,但这是务实的方法。
Http::fake([
'address/url/1' => Http::response(['your response' => 'data'], 201, ['Headers']),
'address/url/2' => Http::response(['your response' => 'data'], 201, ['Headers']),
]);
一般来说,模拟从来没有真正测试过它的工作原理,因为你的模拟是你定义的功能,而不是 api 的。我们的主和救世主说过这句名言。我并不完全同意它,我主要是为了测试执行的方便而嘲笑它。
推荐阅读
- java - TestNG vs Junit vs Mockito?
- ios - iOS13:PopoverPresentationController - 箭头一侧的边框缺失
- c# - 在将 DBSet 转换为列表之前,实体框架不会看到数据库中的数据
- c - 如何用 C 编写一个基本的汇编程序?
- java - Java OutputStream 读取字符串行
- python - 在 String Slicing str [:3] 中,如果字符串的长度小于 3,这个切片会返回还是不返回?
- python - 我的 CNN Keras 无法正确预测,我不知道该怎么办
- javascript - 在 GET 请求中使用激活的路由参数变量返回 null
- python - 仅给定闭包函数,如何访问已关闭的变量?
- reactjs - React Router 中的“React 无法识别 DOM 元素上的道具”