Функциональный тест Symfony2 для выбора флажков
У меня возникают проблемы при написании функционального теста Symfony 2 для установки флажков, являющихся частью массива (т. Е. Виджета множественного и расширенного выбора)
В документации пример
$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 ""
,
2 ответа
Пытаться
$form['niwa_pictbundle_proxytype[chronologyControls]'][0]->tick();
Индексирует это от 0 даже в форме, которую это говорит []
Или, если это вам не очень поможет, вы можете попробовать поместить массив непосредственно в действие вместо использования селекторов форм Symfony. См.: Symfony2: тест на ArrayCollection дает "Недоступное поле"
Надеюсь, что один из них поможет вам.
Я думаю, что самое пуленепробиваемое решение, работающее в 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();