Symfony2功能测试:直接传递表单数据

时间:2012-01-25 15:33:27

标签: symfony phpunit

我正在使用phpunit来运行功能测试,但我遇到了一些问题。问题是phpunit不知道JS,我有一个带有动态填充的选择框的表单需要jQuery。

所以我需要直接传递表单数据。 'book'给出了以下示例:

// Directly submit a form (but using the Crawler is easier!)
$client->request('POST', '/submit', array('name' => 'Fabien'));

当我使用此示例时,控制器未收到任何表单数据。最初我看到传递数组键'name'在我的情况下不正确,因为我需要在我的代码中使用'timesheet'的表单名称。所以我尝试了类似的东西:

$client->request('POST', '/timesheet/create', array('timesheet[project]' => '100'));

但这仍然无效。在控制器中,我试图了解发生了什么以及如果收到了什么:

$postData = $request->request->get('timesheet');
$project = $postData['project'];

这不起作用,$ project仍然是空的。但是,如果我使用以下代码,我得到了值:

$project = $request->request->get('timesheet[project]');

但很明显,这不是我想要的。至少虽然我可以看到有一些POST数据。我的最后一次尝试是在测试方法中尝试以下内容:

$this->crawler = $this->client->request('POST', '/timesheet/create/', array('timesheet' => array(project => '100'));

所以我试图将'timesheet'数组作为请求参数数组的第一个元素。但有了这个,我得到了错误:

Symfony\Component\Form\Exception\UnexpectedTypeException: Expected argument of type "array", "string" given (uncaught exception) at /mnt/hgfs/pmt/src/vendor/symfony/src/Symfony/Component/Form/Form.php line 489

如果有人可以扩展“书”中有关我应该如何运作的话,我会很高兴。

控制器中的表单绑定:

    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);

        if ($form->isValid()) {
            $postData = $request->request->get('timesheet');
            $project = $postData['project'];                             

            $timesheetmanager = $this->get('wlp_pmt.timesheet_db_access');
            $timesheetmanager->editTimesheet($timesheet);                                               
            return $this->redirect($this->generateUrl('timesheet_list'));
        }
    }

3 个答案:

答案 0 :(得分:5)

如果您想知道如何使用测试客户端注入POST数据数组......

在您的测试方法中,执行类似

的操作
$crawler = $client->request('POST', '/foo', array(
    'animal_sounds' => array(
        'cow'  => 'moo',
        'duck' => 'quack'
    )
); // This would encode to '/foo?animal_sounds%5Bcow%5D=moo&animal_sounds%5Bduck%5D=quack'

$this->assertTrue( ... );

在控制器中,你可以像这样访问你的参数:

$data = $request->request->get('animal_sounds');
$cowNoise = $data['cow'];
$duckNoise = $data['duck'];

如果测试方法是注入有效的表单数据,您可以使用表单API ...

答案 1 :(得分:2)

你的行动中有$request个参数吗? 这就是我的request->get()为空的原因:

//WRONG
public function projectAction()
{
    $request = Request::createFromGlobals();
    $project = $request->request->get('timesheet[project]');
    //$project will be empty
}


//CORRECT
public function projectAction(Request $request)
{
    $project = $request->request->get('timesheet[project]');
    //$project is not empty
}

How do I create a functional test which includes a POST to a page with parameters?

答案 2 :(得分:0)

尝试使用$form->bind($clientData)代替$form->bindRequest($request)