#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. Единственная трудность заключалась в том, что мое решение отлично работало в браузере.