如何在 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,以便我可以测试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 基础库,无需测试。库有责任对其进行测试,您只需使用它并期望它能够工作。 【参考方案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中删除公共文件夹

在 Laravel 测试用例中模拟一个 http 请求并解析路由参数

如何从 Laravel 正确模拟 Illuminate\Http\Request 类

Laravel ::all() 命令只返回 1 条记录

Laravel创建 Service Provider 测试实例