Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mink+Behat-将radio的值设置为无效值_Php_Behat_Mink - Fatal编程技术网

Php Mink+Behat-将radio的值设置为无效值

Php Mink+Behat-将radio的值设置为无效值,php,behat,mink,Php,Behat,Mink,我有一个表单,用户必须在其中选择性别。这是一台有两种选择的收音机——男性和女性。作为我测试的一部分,我想看看当提交非男性或女性的内容时,网站的反应如何。由于页面的HTML可以很容易地更改为用户端的任何内容,因此我想在我的场景中模拟这种行为。然而,Mink附带的browserKit太聪明了——它识别出它正在处理一个收音机,如果我试图将值更改为不期望的值,它会帮助我抛出一个异常 输入应用程序[sex]不能将IDonKnow作为值可能的值:男性,女性。无效辩论例外 如何将iDontKnow作为值提交给

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

输入应用程序[sex]不能将IDonKnow作为值可能的值:男性,女性。无效辩论例外

如何将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 %}
然后,我有一个单元测试来设置生产配置,并确保有一个选择

经过一夜的思考,我决定这不是正确的方法。Behat+Mink旨在从浏览器的角度测试行为:无论传统浏览器能做什么,您都可以使用Behat+Mink

但是这种行为——将值提交到表单元素之外的表单——并不是传统浏览器所能做的一部分。当输入元素只接受foo或bar时,您不能常规地告诉浏览器提交baz

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


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

我所做的事情很棘手,我不确定我是否会将其称为最佳实践:在开发/测试/登台过程中,我的模板会弹出一个表单,然后我可以按照自己的意愿填写。在生产中,我的模板会吐出来。我使用单元测试来断言这一点。在您的情况下,您基本上会根据您是在测试中还是在生产中更改输入类型。您可以将它们设置为非必需的,如果未设置它们,则会产生结果,或者将它们两者都设置为可切换的,以便两者都可以设置[单击-打开-单击-关闭]如果两个按钮都设置好了,你可能会得到第三个结果——它们需要是单独的按钮,而不是成对的。或者您可以添加第三个按钮,其中有一个“不想说”选项。感谢您的回复,我也一直在考虑这个问题,它确实似乎属于单元测试,而不是行为测试。但可以在浏览器中检查元素,并更改“选择”的值。但这超出了普通用户的范围。这里的问题是,symfony中表单的单元测试验证是一件令人头痛的事情,比如说不要测试验证:它是由在测试用例中不活动的侦听器应用的,它依赖于验证配置。相反,直接对自定义约束进行单元测试。对,我同意Symfony的观点:不要测试表单视图,测试表单控件。该控件通常位于控制器(如MVC)中,但有时位于表单服务中。简而言之,您应该对执行if的代码进行单元测试,以检查是否允许使用该值。这似乎是正确的方法,但代码中不只是if语句,而是注释、yml文件、表单生成器服务等。它似乎与symfony本身紧密耦合。但是总的方向是正确的-单元测试:-非常感谢
// templates/user-preferences.phpt
// ...
{% if $config->isTesting() %}
    {% include 'input-text.phpt' with options only %}
{% else %}
    {% include 'select.phpt' with options only %}
{% endif %}