如何测试具有多个提交的表单
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]);
将设置提交按钮...
我有一个包含 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]);
将设置提交按钮...