【问题标题】:How to test Http Pool in Laravel?如何在 Laravel 中测试 Http Pool?
【发布时间】: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,以便我可以测试withHeaderswithBodypost 是否使用正确的数据正确调用?

类似:

$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 基础库,无需测试。库有责任对其进行测试,您只需使用它并期望它能够工作。

标签: php laravel phpunit mockery


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多