Передача параметров в тест формы symfony 5.4 не работает

#symfony #testing #phpunit #php-8

Вопрос:

Я пытался в течение 5 часов уже без успеха… У меня есть приложение Symfony 5.3 и реализована страница поиска, которая не привязана к сущности. Работает отлично, однако при создании теста общей доступности параметры не передаются контроллеру. Я пытался издеваться над массивом $_POST, передавая массив третьему параметру $client-gt;request(), но результат всегда показывает, что выполняется метод GET, и параметр не включен в запрос.

Форма выглядит так:

 lt;form class="form-search" action="{{ path('search_result') }}" method="post"gt;  lt;input name="searchwords" placeholder="{{ 'search.placeholder'|trans }}" type="text" class="input-large search-query"gt;  lt;button type="submit" class="btn search rounded"gt;lt;i class="far fa-search"gt;lt;/igt;lt;/buttongt; lt;/formgt;  

В моем контроллере можно получить доступ к параметру «поисковые слова» со следующими параметрами:

 $vars = Request::createFromGlobals(); $temp_searchwords = explode(' ', $vars-gt;get('searchwords'));  

Теперь я пытаюсь передать параметры во время теста общей доступности

 $crawler = $client-gt;request('POST', '/de/search/result', ["searchwords" =gt; "test"]);  

Результат показывает, что используется метод GET, и параметры не передаются Контроллеру. Я также пытался издеваться над системной переменной $_POST:

 $_POST = ["searchwords" =gt; "test strings"]  

запрос::createFromGlobals(); не дает параметров в моем контроллере, возможно, потому, что вместо «POST» используется метод GET, как указано в моем вызове $client-gt;request ().

Еще одна попытка, взятая из официальной документации Symfony 5.3, также не удалась, поскольку параметр не был передан моему контроллеру:

 $buttonCrawlerNode = $crawler-gt;selectButton(''); $form = $buttonCrawlerNode-gt;form(); $form['searchwords'] = "test string"; // at this point the $form object contains the parameter "searchwords" and the value "test string" $crawler = $client-gt;submit($form);  

Вопрос: Как бы я передал параметр своему контроллеру и принудительно отправил запрос «ОПУБЛИКОВАТЬ» в своем тесте? Как уже было сказано, поиск отлично работает в реальной среде браузера.

Комментарии:

1. Почему бы не использовать компонент формы symfony для создания вашей формы ? Я думаю, что таким образом вы легко получите свои параметры.

2. Компонент формы привязан к сущности, и мне не нужна и не нужна сущность, которая не должна сохраняться в базе данных. Я боюсь, что это также может привести к созданию мертвой таблицы базы данных. Я вижу две проблемы, одну из которых необходимо решить: при вмешательстве в массив $_POST[] строка «Запрос::createFromGlobals();» не извлекает глобалы из массива $_POST. ИЛИ: «$клиент-gt;запрос(‘POST’, ‘/de/поиск/результат’, [«поисковые слова» =gt;gt; «тест»]);» должен выполнить публикацию по запросу, прямо сейчас он выполняет запрос GET по неизвестной причине 🙁

3. A form component is tied to an Entity нет необходимости, вы можете создать компонент формы без сущности

4. Я потратил некоторое время, играя с контроллерами, ресурсами Twig и веб-тестом. Короче говоря, мне не удалось создать рабочий тест. Накладные расходы, связанные с использованием механизма форм Symfony для такого простого процесса, непрактичны. Однако в общей сложности через 7 часов я это понял: я вызвал переменные post через get(). Но их необходимо получить из объекта запроса. Тогда тест тоже работает!

Ответ №1:

Должен ли кто-нибудь когда-нибудь оказаться в такой ситуации:

Я вызвал переменную post «поисковое слово» с помощью следующей функции.

 $vars = Request::createFromGlobals(); $searchwords = explode(' ', $vars-gt;get('searchwords'));  

Однако это работает только в браузере, поскольку WebTest создает объект запроса без перенаправления с помощью глобальных переменных.

Реальное решение состоит в том, чтобы автоматически подключить объект запроса в функции контроллера и использовать его для поиска параметров:

 public function searchResultAction($_locale, DuddeSearch $ds, Request $request) {  [...]  $searchwords = explode(' ', $request-gt;get('searchwords')); }  

Эта проблема — ошибка новичка с моей стороны. Автопроводка явно и явно упоминается в «Лучших практиках» Symfony. Единственная трудность заключалась в том, что мое решение отлично работало в браузере.