将参数传递给 symfony 5.4 表单测试不起作用

Passing parameters to symfony 5.4 form test not working

我已经尝试了 5 个小时但没有成功...我有一个 Symfony 5.3 应用程序并实现了一个未绑定到实体的搜索页面。工作完美,但是在创建一般可用性测试时,参数不会传递给控制器​​。我尝试用 $_POST 数组进行模拟,将一个数组传递给 $client->request() 的第三个参数,但结果总是显示执行了 GET 方法并且该参数未包含在请求中。

表格是这样的:

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

在我的控制器中,可以通过以下方式访问参数“searchwords”:

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

现在我正尝试在我的一般可用性测试期间传递参数

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

结果显示使用了GET方法,没有给Controller传递参数。我还尝试使用 $_POST 系统变量进行模拟:

$_POST = ["searchwords" => "test strings"]

Request::createFromGlobals();在我的控制器中没有给出任何参数,可能是因为使用了 GET 方法而不是我的 $client->request() 调用中请求的 'POST'。

从官方 Symfony 5.3 文档中获取的另一个尝试也失败了,参数未传递到我的控制器:

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

问题:如何将参数传递给我的控制器并在我的测试中强制执行 'POST' 请求?如前所述,搜索在真实的浏览器环境中运行良好。

是否有人遇到过这种情况:

我通过以下函数调用了 post 变量“searchword”。

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

但是,这只在浏览器中有效,因为 WebTest 创建一个请求对象,没有通过全局变量转移。

真正的解决方案是在控制器函数中自动装配请求对象并将其用于参数检索:

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

这个问题是我初学者的错误。 Autowiring 在 Symfony 的“最佳实践”中明确而突出地提到。唯一的困难是我的解决方案在浏览器中完美运行。