Intereting Posts
Создать дату / время, когда формат неизвестен Как правильно размещать и вставлять значения в базу данных? Создание WSDL при использовании собственного класса SOAP PHP? Я пытаюсь сделать html-форму, которая при заполнении будет вставляться в мою базу данных sql. однако я получаю эту ошибку, ни одна база данных не выбрана PHP удаляет первые нули PHP – функция раскрывающегося списка, которая удерживает текущую страницу в фокусе Функция PHP strtotime () неверна на 1 час? Сохранить удаленный img-файл на сервере, с php Неплохо ли использовать пробелы в индексах ассоциативных массивов PHP? CakePHP Cache :: write () Могут ли ключи группироваться по модели? Использование Twig для генерации JSON Минимальная цена заказа Opencart Как получить сегодняшние / вчера данные из базы данных MySQL? интеграция формы sagepay – ошибка 3045 Перенаправление на страницу / URL-адрес после нажатия кнопки оповещения

Как отправить недопустимый параметр выбора в WebTestCase с помощью symfony 2.3

Я пытаюсь проверить форму в symfony 2.3, которая имеет выбор ввода … наряду с загрузкой файла (enctype multipart / form-data)

Вход выбора следующий:

  • Это обязательное поле.
  • Имеет 3 варианта [1, 2, 3]

с помощью 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. ), ));