Я пытаюсь проверить форму в symfony 2.3, которая имеет выбор ввода … наряду с загрузкой файла (enctype multipart / form-data)
Вход выбора следующий:
с помощью DomCrawler я выбираю форму
$form = $crawler->selectButton->('Update')->form()
затем попытайтесь установить значение
$form['select'] = null
или $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
но ответ не то, что я ищу. Я хочу протестировать и убедиться, что сервер вернет 200 вместе с сообщением, позволяющим пользователю узнать, что они завязывают, невозможно.
PS: Я могу добиться желаемых результатов с Postman в хроме.
Я не знаю ни одного метода в SF 2.3, который работает как disableValidation
. Тем не менее, я думаю, что отправка фальшивого запроса должна сделать трюк. Я также думаю, что способ использования метода запроса неверен. Проверьте документацию для версии 2.3 SF, у вас есть пример того, как подделать запрос:
// Form submission with a file upload use Symfony\Component\HttpFoundation\File\UploadedFile; $photo = new UploadedFile( '/path/to/photo.jpg', 'photo.jpg', 'image/jpeg', 123 );// Fake photo upload if you like, if not, just send the select value. $client->request( 'POST', '/submit',// valid route array('select' => 'ssjksjkajsdfj'),// Substitute here the name of your select and the value you want to send array('photo' => $photo) );
он должен отправить запрос, и контроллер должен ответить с ошибкой 200 и ошибкой, если все в порядке.
Надеюсь, поможет.
ОБНОВИТЬ
Хорошо, пара вещей здесь: CSRF важен и формат параметров в запросе тоже.
Поскольку ваша форма использует CSRF, вы должны отправить ее в запросе, иначе она не удастся и перенаправит вас в «пустую» форму. Кроме того, запрос должен отправить данные в соответствующем формате. Предполагая, что сгенерированный код формы называет входы в форме my_form[name]
вы должны создать их в запросе соответственно:
$csrfToken = $client->getContainer()->get('form.csrf_provider')->generateCsrfToken('my_form');// Generate CSRF for my_form $crawler = $client->request( 'POST', '/ajax/register', // valid route array( 'my_form' => array(// form accepts params in form my_form[name] '_token' => $csrfToken, 'select' => 'asdfasdf',// select I want to send invalid value 'photo' => $photo, // the uploaded photo 'whatever' => 'whatever', // rest of required parameters. ), ));