Mink + Behat - 将无线电的值设置为无效值

Mink + Behat - setting a value of radio to invalid value

我有一个表单,用户必须 select 性别。这是一款有两种选择的收音机 - 男性和女性。作为我测试的一部分,我想看看网站在提交男性或女性以外的内容时如何反应。由于页面的 HTML 可以很容易地更改为用户端的任何内容,因此我想在我的场景中模仿这种行为。然而,Mink 附带的 browserKit 太聪明了——它识别出它正在处理一个无线电,如果我试图将值更改为不期望的值,它会很有帮助地抛出一个异常。

Input "application[sex]" cannot take "iDontKnow" as a value (possible values: male, female). (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 暗示必须采取一些根本不同的方法。

这似乎是我正在处理的很常见的情况,那么推荐的方法是什么?

正如我最初在评论中提到的那样,我过去通过让我的模板系统生成不同的标记来促进测试来处理这个问题。在我的场景中,代码大致如下所示:

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

然后我有一个单元测试来设置生产配置并确保有 select。

经过深思熟虑,我认为这不是正确的做法。 Behat+Mink 旨在从浏览器的角度测试行为:传统浏览器能做的,Behat+Mink 也能做。

但是这种行为——向不在表单元素中的表单提交值——不是传统浏览器可以执行的操作的一部分。当输入元素仅接受 "foo" 或 "bar".

时,您不能按惯例告诉浏览器提交 "baz"

根据定义,要发送此数据,不能使用浏览器。因此,Behat+Mink 不是这项工作的正确工具。

我认为测试这种情况的正确方法是使用单元测试将越界数据泵入服务器端的接受表单。这可能是您的控制器,也可能是专用表格 class.