我正在尝试在 symfony 2.3 中测试一个表单,该表单具有选择输入...以及文件上传(enctype multipart/form-data)
选择输入如下...
- 这是必填字段。
- 有 3 个选项 [1, 2, 3]
使用 DomCrawler 我选择表单
$form = $crawler->selectButton->('Update')->form()
然后尝试设置 select 的值
$form['select'] = null
or
$form['select'] = ssjksjkajsdfj
DomCrawler 中有一个内部验证系统,如果我这样做,它会返回以下错误。
InvalidArgumentException: Input "select" cannot take "ssjksjkajsdfj" as a value (possible values: 1, 2, 3).
在 symfony 2.4 及更高版本中,DomCrawler/Form 中有一个神奇的方法,称为disableValidation()
这非常有效。不幸的是,由于某些依赖项需要 2.3,我无法升级
我也尝试使用$client->Request()
直接方法
$post_data = '------WebKitFormBoundaryi7fAxO2jrDFTmxef
Content-Disposition: form-data; name="select"
ssjksjkajsdfj
------WebKitFormBoundaryi7fAxO2jrDFTmxef--';
$client->request(
'POST',
$form->getUri(),
array(),
array(),
array(
'CONTENT_TYPE' => 'multipart/form-data; boundary=----WebKitFormBoundaryi7fAxO2jrDFTmxef',
),
$post_data
);
但 symfony 似乎并不知道/关心形式,只是返回一个
没有任何错误消息的常规表单,表单处理程序由于某种原因不会验证表单。
这是控制器中的 updateAction
public function updateAction(Request $request, $id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('CoyoteAdBundle:Ad')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Ad entity.');
}
$old_entity = $entity;
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$this->archiveImage($old_entity);
$entity->upload();
$em->flush();
$this->addSuccessFlash('Ad has been updated successfully!');
return $this->redirect($this->generateUrl('ad_show', array('id' => $id)));
}
return $this->render('CoyoteAdBundle:Ad:edit.html.twig', array(
'entity' => $entity,
'form' => $editForm->createView(),
));
}
在这里我发现了一个确切的问题......使用 Symfony DomCrawler 在选择输入中选择不可能的值 https://stackoverflow.com/questions/22884366/select-impossible-value-in-tests-in-symfony-crawler
但答案不是我想要的。我想测试并确保服务器将返回 200 以及一条消息,让用户知道他们要做什么是不可能的。
PS:我可以使用 Chrome 中的 Postman 达到预期的结果。