我在编写Symfony 2功能测试时遇到问题,无法设置属于数组的复选框(即多个和扩展的选择小部件)
documentation中的例子是
$form['registration[interests]']->select(array('symfony', 'cookies'));
但它没有显示哪些html可以使用它并且它不适用于我的。这是我的表格的缩减版本
<form class="proxy" action="/proxy/13/update" method="post" >
<input type="checkbox" id="niwa_pictbundle_proxytype_chronologyControls_1" name="niwa_pictbundle_proxytype[chronologyControls][]" value="1" />
<input type="checkbox" id="niwa_pictbundle_proxytype_chronologyControls_2" name="niwa_pictbundle_proxytype[chronologyControls][]" value="2" />
<input type="checkbox" id="niwa_pictbundle_proxytype_chronologyControls_3" name="niwa_pictbundle_proxytype[chronologyControls][]" value="3" />
</form>
一旦它在那里工作,我将转向手动制作的表格
<input type="checkbox" id="13" name="proxyIDs[]" value="13">
<input type="checkbox" id="14" name="proxyIDs[]" value="14">
<input type="checkbox" id="15" name="proxyIDs[]" value="15">
我尝试过像
这样的事情$form = $crawler->selectButton('Save')->form();
$form['niwa_pictbundle_proxytype[chronologyControls]']->select(array('3'));
$form['niwa_pictbundle_proxytype[chronologyControls][]']->select(array('3'));
但是第一次失败说select
正在非对象上运行而第二个说Unreachable field ""
。
答案 0 :(得分:13)
尝试
$form['niwa_pictbundle_proxytype[chronologyControls]'][0]->tick();
它甚至以[]
的形式从0开始索引或者如果它对您没有帮助,您可以尝试将数组直接发布到操作而不是使用symfony的表单选择器。请参阅:Symfony2: Test on ArrayCollection gives "Unreachable field"
希望他们中的一个可以帮助你。答案 1 :(得分:0)
我认为2017年最灵活的解决方案是扩展您的测试类:
/**
* Find checkbox
*
* @param \Symfony\Component\DomCrawler\Form $form
* @param string $name Field name without trailing '[]'
* @param string $value
*/
protected function findCheckbox($form, $name, $value)
{
foreach ($form->offsetGet($name) as $field) {
$available = $field->availableOptionValues();
if (strval($value) == reset($available)) {
return $field;
}
}
}
在测试电话中:
$this->findCheckbox($form, 'niwa_pictbundle_proxytype[chronologyControls]', 3)->tick();