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

时间:2016-03-17 20:24:15

标签: php behat mink

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

  

输入"申请[性别]"不能采取" 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 个答案:

答案 0 :(得分: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。

但是这种行为 - 将值提交给不在表单元素中的表单 - 并不是传统浏览器可以做的事情的一部分。您不能通常告诉浏览器提交&#34; baz&#34;当input元素只接受&#34; foo&#34;或&#34; bar&#34;。

要发送此数据,根据定义,必须不使用浏览器。因此,Behat + Mink并不适合这项工作。

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