如何测试具有多个提交的表单

How to Test a Form with Multiple Submit

我有一个包含 2 个提交的表单

// src/Form/FooType.php
$builder
    ->add('mainsubmit', SubmitType::class, [])
    ->add('extrasubmit', SubmitType::class, [])

在我的控制器中,我根据按下的提交做了一些不同的处理

// src/Controller/FooController.php
if ($form->isSubmitted() && $form->isValid()) {
    if ($form->get('extrasubmit')->isClicked()) {
        // do some extra stuff
    }

当我点击额外按钮时,我可以在请求 POST 参数 "extrasubmit" => "".
中看到它的 symfony Profiler 一切正常。

我正在使用爬虫进行功能测试。 无需尝试额外提交,它工作正常,因此我们可以假设我的测试没有错字。

如何模拟额外提交的点击?

第一次尝试:

$form = $crawler->filter('form')->form();
// [...]
$form['my_form_name[extrasubmit]'] = true;
$httpClient->submit($form);
// => InvalidArgumentException: Unreachable field "extrasubmit"

第二次尝试:

$form->get('my_form_name[extrasubmit]')->setValue("");
// => InvalidArgumentException: Unreachable field "extrasubmit"

就像经常遇到 DomCrawler 问题一样,最好通过 $form->getPhpValues() 值数组 returns。
然后你只需要模仿请求中给出的值

$values = $form->getPhpValues();
$values['my_form_name']['extrasubmit'] = '';

$httpClient->request(
    $form->getMethod(),
    $form->getUri(),
    $values
);

根据code,您可以通过表单上的setNode($domnode)方法设置按钮。可悲的是,没有函数可以在表单对象本身上找到节点(因为节点不必是表单的后代,这甚至可能没有多大帮助)。

所以我猜类似于

$form->setNode($crawler->filter('#extrasubmitbutton-id')[0]);

将设置提交按钮...