使用PHPUnit发送POST请求

时间:2013-09-19 17:05:09

标签: php symfony post tdd phpunit

我有一个symfony网站,我正在尝试进行一些单元测试。我有这种测试,我尝试提交一些东西:

<?php

namespace Acme\AcmeBundle\Tests\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class HomeControllerTest extends WebTestCase {

    public function testrandomeThings() {

        $client = static::createClient();
        $crawler = $client->request(
            'POST',
            '/',
            array(
                "shopNumber"        => 0099,
                "cardNumber"        => 231,
                "cardPIN"           => "adasd"),
            array(),
            array());
        }

但我不认为Im发送的数据是在控制器中收到的:

class HomeController extends Controller
{
    public function indexAction()
    {

        var_dump($_POST);
        die;
        return $this->render('AcmeBundle:Home:index.html.twig');
    }

}

var_dump实际上是给我一个空数组。

通过我的POST请求发送信息我缺少什么?

2 个答案:

答案 0 :(得分:7)

$_POST是由PHP填充的变量,只有通过http直接调用时才会从这个全局变量创建symfony请求。 symfony抓取工具不会发出实际请求,它会根据$client->request中提供的参数创建请求并执行它。您需要通过Request对象访问此内容。切勿直接使用$_POST$_GET等。

use Symfony\Component\HttpFoundation\Request;

class HomeController extends CoralBaseController
{
    public function indexAction(Request $request)
    {

        var_dump($request->request->all());
        die;
        return $this->render('CoralWalletBundle:Home:index.html.twig');
    }

}

使用$request->request->all()获取数组中的所有POST参数。要仅获取特定参数,您可以使用$request->request->get('my_param')。如果您需要访问GET参数,可以使用$request->query->get('my_param'),但更好地设置路由模式中已有的查询参数。

答案 1 :(得分:2)

我认为你正在尝试这样做:

$client = static::createClient();
    $client->request($method, $url, [], [], [], json_encode($content));
    $this->assertEquals(
        200,
        $client->getResponse()
            ->getStatusCode()
    );

您将数据(内容)作为params数组放入,但是您希望将其作为JSON编码字符串的原始内容放入。