Codeception: Тест отправки формы с массивом чекбоксов
В рамках приобщения к автоматизированному тестированию, начали вторую попытку покрытия тестами биллинга. Инструменты тестирования (да и я, по всей видимости тоже) с прошлого раза сильно продвинулись и дело пошло несколько бодрее.
Основным фреймворком, не долго думая, был взят Codeception. Ну как не долго думая… Почитал весь раздел Guides, выглядело всё действительно интересно.
Однако в реальной работе не всё так радужно, как в документации. Но об этом я напишу, может быть, в одной из следующих статей.
А сейчас к теме.
Основная масса работы в биллинге заключается в заполнении разнообразных форм и нажимании на ссылки. И если со ссылками всё более-менее понятно, то тестирование форм не очень-то освещается в документации.
По крайней мере те аспекты, с которыми пришлось столкнуться нам.
Для приёмочного тестирования на данный момент мы используем модуль PhpBrowser. И для тестирования форм там есть следующие методы:
fillField()
checkOption()
selectOption()
submitForm()
Так что типичный тест формы выглядел следующим образом:
$I->fillField('input[name="first"]', 'first_value');
$I->fillField('input[name="second"]', 'second_value');
$I->submitForm('form', []);
И всё прекрасно работает, незаполненные значения из формы добираются из html и всё прекрасно. До тех пор, пока в форме не надо передать массив из чекбоксов.
Итак, есть форма:
<form method="POST">
<input type="checkbox" name="many_fields[]" value="1" id="inp_1">
<input type="checkbox" name="many_fields[]" value="2" id="inp_2">
<input type="checkbox" name="many_fields[]" value="3" id="inp_3">
<input type="submit">
</form>
Конечно, сама форма гораздо сложнее, а здесь только участок, который вызвал затруднение.
Я предполагал, что это должно работать так:
$I->checkOption('#inp_1');
$I->checkOption('#inp_3');
$I->submitForm('form', []);
Но вместо этого получалась какая-то ерунда, а именно приходил массив из трёх пустых элементов. Если просетать только один чекбокс, то приходил массив из трёх элементов, первый из которых имел значение, но не то, что указано в value.
К счастью, можно спросить об этом автора проекта на github.
И вот что оказалось: С формами можно работать двумя способами: 1. Заполнять поля по отдельности и кликать по чекбоксам и кнопкам с помощью соответствующих методов; 2. Посылать массив данных через submitForm.
Причём смешивать их нельзя. Т.е. либо
$I->checkOption('#inp_1'); $I->checkOption('#inp_3'); $I->click('input[type="submit"]');
либо
$I->submitForm('form', ['many_fields' => [1,2]);
Хотя в документации на submitForm приводится пример работы с массивами в формах, однако имена инпутов при этом разные, т.к. используется массив с индексами. Так что было неочевидно, что так тоже можно делать.
Сейчас я использую codeception версии 1.8.4 и первый вариант предпочтительней, т.к. на сервер пошлётся ровно тот массив, который вы ожидаете.
Во втором варианте будет послан всё равно массив со всеми чекбоксами, но значения будут заполнены только те, которые указаны во втором параметре submitForm
.
В версии, которая пока в разработке, это уже исправлено и оба варианта отрабатывают корректно. Будем ждать релиза.
Роутер Mikrotik 951G-2HnD Обновление блога. Опять.