首页 > 解决方案 > 如何在 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...');

标签: phplaravelphpunitmockery

解决方案


我对 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 的。我们的主和救世主说过这句名言。我并不完全同意它,我主要是为了测试执行的方便而嘲笑它。

泰勒奥特威尔推特


推荐阅读