无法伪造 Laravel HttpClient 响应

Trouble faking a Laravel HttpClient response

我正在尝试测试以下代码:

DimonaClient 只是 Laravel HttpClient 的简单包装器;此处简化功能:

getDeclaration() 响应是 \Illuminate\Http\Client\Response


我在测试中尝试做的是:

  1. 模拟 DimonaClient class 所以我不会创建实际的 api 调用
  2. “模拟”(使用 Laravel 的 Http::response())我想要的响应,以便我可以测试 200 w/ 某些状态是否调度适当的事件(也被模拟,但是此处不相关)

我的测试代码是这样的:

我的问题似乎是:

  1. getDeclaration() 具有 Illuminate\Http\Client\Response 的期望,但我似乎无法创建任何满足该期望的东西(新响应需要 MessageInterface 等...)
  2. 我的测试实际上不需要 getDeclaration() 到 return 任何东西,所以我想知道我是否应该在任何情况下以不同的方式模拟它(我将这个假设基于 Http::response 处理我正在测试 $response->ok() 之类的内部代码,而不是 Mockery 期望)

我觉得离完成这项工作还差一小步,但绕着圈子试图正确连接它。

TIA!

如果您正在使用 Http Facade,则不需要模拟 DimonaCient。您的测试就快完成了,但让我告诉您您会做些什么:

/** @test */
public function it_can_handle_an_approved_submission(): void
{
    Http::fake([
        '*' => Http::response([
            'declarationStatus' => [
                'result' => DimonaDeclarationStatus::ACCEPTED,
                'dimonaPeriodId' => $this->faker->numerify('############'),
            ],
        ],
    ]);

    $dimonaDeclarationId = $this->faker->numerify('############');

    // Do your normal call, and then assertions
}

这样做,你会告诉 Http 伪造任何 URL,因为我们正在使用 *。我建议您使用 $this->endpoint/$declarationId,这样如果它不匹配,您也会知道您没有到达正确的端点。


我不确定 Laravel 您使用的是什么,但自 Laravel 6+ 起可用,请检查 Http fake URLs