gpt4 book ai didi

php - 我可以使用 Laravel 的 `call` 方法在单元测试中发送原始 JSON 数据吗?

转载 作者:可可西里 更新时间:2023-11-01 12:51:25 26 4
gpt4 key购买 nike

我正在尝试对我的 Stripe webhook 处理程序的实现进行单元测试。 Stripe webhook 数据作为 POST 请求正文中的原始 JSON 通过网络传输,因此我这样捕获和解码数据:

public function store()
{
$input = @file_get_contents("php://input");
$request = json_decode($input);
return Json::encode($request);
}

我正在尝试对这段代码进行单元测试,但我不知道如何在单元测试中发送原始 JSON 数据,以便我可以使用 file_get_contents("php:input//") 函数。这是我尝试过的(使用 PHPUnit):

protected $testRoute = 'api/stripe/webhook';

protected $validWebhookJson = <<<EOT
{
"id": "ch_14qE2r49NugaZ1RWEgerzmUI",
"object": "charge",
// and a bunch of other fields too
}
EOT;

public function testWebhookDecdoesJsonIntoObject()
{
$response = $this->call('POST', $this->testRoute, $this->validWebhookJson); // fails because `$parameters` must be an array
$response = $this->call('POST', $this->testRoute, [], [], ['CONTENT_TYPE' => 'application/json'], $this->validWebhookJson);
dd($response->getData(true)); // array(0) {} BOOOO!!! Where for to my data go?
}

我也尝试过 curl 但这会发出外部请求,从单元测试的角度来看这对我来说没有意义。我如何模拟一个 POST 请求,其中包含正文中的原始 JSON 数据,我的 store 方法将获取这些数据?

最佳答案

可以。但是您需要将编码后的 JSON 作为内容(又名请求正文)而不是参数发送。

$this->call(
'POST',
'/articles',
[],
[],
[],
$headers = [
'HTTP_CONTENT_LENGTH' => mb_strlen($payload, '8bit'),
'CONTENT_TYPE' => 'application/json',
'HTTP_ACCEPT' => 'application/json'
],
$json = json_encode(['foo' => 'bar'])
);

这是第 7 个参数。

如果您查看方法定义(在 Laravel 的核心中),您应该能够看到它所期望的。

public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)

虽然 Laravel 5.1 的 post、patch、put、delete 的便捷方法目前不支持此功能。

这是目前正在讨论的补充herehere .

编辑:我应该声明这个答案是基于 Laravel 5.1 安装的,所以如果你使用的是旧版本,它可能不是 100% 适用于你。

关于php - 我可以使用 Laravel 的 `call` 方法在单元测试中发送原始 JSON 数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com