Php KernelBrowser向body POST请求添加参数

Php KernelBrowser向body POST请求添加参数,php,symfony,phpunit,Php,Symfony,Phpunit,我正在尝试使用phpunit和symfonyWebTestCase对象测试Api的端点。我必须用KernelBrowser发送一个POST请求,但我不知道如何向请求主体添加参数。我的请求对邮递员很有效 我试过这个 $client->request('POST'、'/url'、['param1'=>'value1'、'param2'=>'value2']) 它不起作用了 我试过这个 $client->request('POST','/url',[],[],[],[],“{param1:value,

我正在尝试使用phpunit和symfonyWebTestCase对象测试Api的端点。我必须用KernelBrowser发送一个POST请求,但我不知道如何向请求主体添加参数。我的请求对邮递员很有效

我试过这个
$client->request('POST'、'/url'、['param1'=>'value1'、'param2'=>'value2'])

它不起作用了

我试过这个
$client->request('POST','/url',[],[],[],[],“{param1:value,param2:value}”)

它不起作用, 我无法使用
$client->submitForm()
方法,因为表单是由另一个应用程序发送的

可能它来自我的Api端点,因为我正在使用$\u POST变量?:

$res = false;
if(count($_POST) === 2){
  $user = $this->userrepo->findByName($_POST['value1']);
  if($user){
    if($this->passwordEncoder->isPasswordValid($user[0], $_POST['value2'])){
      $res = true;   
    }
  }
}
return new Response($this->serializer->serialize(['isChecked' => $res], 'json'));
我的测试方法从未通过第一个if语句, 以下是我的测试方法:

$client = static::createClient();
$client->request('POST', '/url', ['value1' => 'value1', 'value2' => 'value2']);
$this->assertStringContainsString('{"isChecked":true}', $client->getResponse()->getContent());
这里是我试图发送的POST请求:

curl --location --request POST 'http://localhost:8000/url' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--form 'value1=value1' \
--form 'value2=value2'

Symfony的测试客户端在内部发送请求。全局
$\u POST
变量将始终为空。您应该使用控制器中的
请求
对象来访问参数。属性
request
包含post数据

public function myAction(Request $request): Response
{
    $postParameters = $request->request;

    $res = false;
    if ($postParameters->count() === 2) {
        $user = $this->userrepo->findByName($postParameters->get('value1'));
        if ($user) {
            if ($this->passwordEncoder->isPasswordValid($user[0], $postParameters->get('value2'))) {
                $res = true;
            }
        }
    }

    return new Response($this->serializer->serialize(['isChecked' => $res], 'json'));
}
关于您的测试调用的不同变体,这个应该与上面的操作一起工作

$client->request('POST', '/url', ['value1' => 'value1', 'value2' => 'value2']);

Symfony的测试客户端在内部发送请求。全局
$\u POST
变量将始终为空。您应该使用控制器中的
请求
对象来访问参数。属性
request
包含post数据

public function myAction(Request $request): Response
{
    $postParameters = $request->request;

    $res = false;
    if ($postParameters->count() === 2) {
        $user = $this->userrepo->findByName($postParameters->get('value1'));
        if ($user) {
            if ($this->passwordEncoder->isPasswordValid($user[0], $postParameters->get('value2'))) {
                $res = true;
            }
        }
    }

    return new Response($this->serializer->serialize(['isChecked' => $res], 'json'));
}
关于您的测试调用的不同变体,这个应该与上面的操作一起工作

$client->request('POST', '/url', ['value1' => 'value1', 'value2' => 'value2']);

出于调试目的,您可以只在控制器中输出
$\u POST
,查看它是否包含您在测试中发送的值。我假设你的理论是正确的,它可能根本不包含这些值。我将尝试使用symfony http请求对象,但在文档中,它们与此类问题无关,因此我想我将报告一个错误。我相信请求是直接发送给内核的,没有启动web服务器或其他什么。因此,实际上将数据放入到全局日志中。这听起来很正确,我只是用不同的方式做事情,所以我输出了<代码> $POST <代码>,它是一个空数组,我也输出了代码> $Req->请求->()/<代码>($Req是HTTP基础组件的请求对象)。它也是空的,因此我将模拟此方法进行调试,您可以在控制器中输出
$\u POST
,查看它是否包含您在测试中发送的值。我假设你的理论是正确的,它可能根本不包含这些值。我将尝试使用symfony http请求对象,但在文档中,它们与此类问题无关,因此我想我将报告一个错误。我相信请求是直接发送给内核的,没有启动web服务器或其他什么。因此,实际上将数据放入到全局日志中。这听起来很正确,我只是用不同的方式做事情,所以我输出了<代码> $POST <代码>,它是一个空数组,我也输出了代码> $Req->请求->()/<代码>($Req是HTTP基础组件的请求对象)。它也是空的,所以我要模拟这个方法