Mink + Behat - установка значения радио на недопустимое значение

У меня есть форма, где пользователь должен выбрать пол. Это радио с двумя вариантами - мужской и женский. В качестве части моего теста я хочу посмотреть, как веб-сайт реагирует, когда отправляется что-то кроме мужчины или женщины. Поскольку HTML-код страницы может быть легко изменен на что-либо на стороне пользователя, я хочу имитировать это поведение в моем сценарии. Однако browserKit, поставляемый с Mink, слишком умен - он распознает, что имеет дело с радио, и услужливо выдает мне исключение, если я пытаюсь изменить значение на что-то, что не ожидается.

Вход "application[sex]" не может принимать "iDontKnow" в качестве значения (возможные значения: мужской, женский). (InvalidArgumentException)

  Scenario Outline: Submit form with various data
    Given I am on homepage
    And I fill in "application[name]" with "<name>"
    And I fill in "application[sex]" with "<sex>"
    And I fill in "application[age]" with "<age>"
    And I fill in "application[country]" with "<country>"
    And I press "Save"
    Then I should see "<expectedText>"

    Examples:
      | name      | sex       | age | country            | expectedText             |
      | Test user | iDontKnow | 30  | United Kingdom     | Invalid sex              |
      | Test user | male      | 30  | NonExistantCountry | Invalid country          |

Как отправить iDontKnow как значение для

<div id="application_sex">
   <input type="radio" id="application_sex_0" name="application[sex]" required="required" value="male">
   <label for="application_sex_0" class="required">male</label>
   <input type="radio" id="application_sex_1" name="application[sex]" required="required" value="female">
   <label for="application_sex_1" class="required">female</label>
</div>

... если это вообще возможно?

Если посмотреть на ChoiceFormField::setValue, то мы поймем, что нужно использовать принципиально иной подход.

Кажется, это довольно обычный случай, с которым я работаю, так каков рекомендуемый подход?

1 ответ

Решение

Как первоначально упоминалось в моем комментарии, я занимался этим в прошлом, когда моя система шаблонов генерировала разметку для облегчения тестирования. В моем сценарии код выглядел примерно так:

// templates/user-preferences.phpt
// ...
{% if $config->isTesting() %}
    {% include 'input-text.phpt' with options only %}
{% else %}
    {% include 'select.phpt' with options only %}
{% endif %}

Затем у меня есть модульное тестирование, которое устанавливает производственную конфигурацию и обеспечивает выбор.

Подумав об этом в одночасье, я решил, что это неправильный способ сделать это. Behat+Mink стремится тестировать поведение с точки зрения браузера: все, что может сделать обычный браузер, вы можете сделать с Behat+Mink.

Но такое поведение - отправка значений в форму, которые не находятся в элементе формы - не является частью того, что может сделать обычный браузер. Вы не можете сказать браузеру, что нужно отправлять "baz", когда элемент ввода принимает только "foo" или "bar".

Для отправки этих данных по определению не следует использовать браузер. Поэтому Behat + Mink не подходит для этой работы.

Я думаю, что правильный способ проверить этот случай - использовать модульный тест для закачки данных за пределы в принимающую форму на стороне сервера. Это может быть ваш контроллер или выделенный класс формы.

Другие вопросы по тегам