我正在使用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'));
}
}
答案 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)
。