Подтвердить что ты не робот

Функциональный тест 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 "".

4b9b3361

Ответ 1

Try

$form['niwa_pictbundle_proxytype[chronologyControls]'][0]->tick();

Он индексирует его от 0 даже в том виде, в котором он говорит []

Или, если это вам действительно не поможет, вы можете попробовать POSTing массив непосредственно к действию вместо использования селекторов форм symfony. См.: Symfony2: тест на ArrayCollection дает "Недоступное поле"

Надеюсь, что один из них поможет вам.

Ответ 2

Я думаю, что наиболее пуленепробиваемым решением, работающим в 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();