首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >水豚没有传递选择参数

水豚没有传递选择参数
EN

Stack Overflow用户
提问于 2016-07-26 07:03:42
回答 1查看 453关注 0票数 1

我正在使用Capybara在Rails应用程序中测试一个表单。

该表单有两个选择框,每个框都有默认选项。当表单在开发和生产中提交时,这些选项将作为参数传递,但由于某些原因,Capybara不会在测试中提交它们。水豚正在寻找选择框和选项OK,因为如果我在抛出错误时放入不存在的选项。但是Capybara在提交表单时既不会传递默认选项,也不会传递选定选项作为参数。

表单代码片段如下所示:

代码语言:javascript
运行
复制
<%= form_for(@reservation, :url => account_reservations_path(account.id), remote: false, :html=>{:id=>'dates_form'}) do |f| %>
       <tr>
    <td style:"text-align:center" colspan="2"><%= f.submit 'Submit Dates, Source of Booking & Room Preference', class: "btn btn-primary btn-sm" %></td>
    </tr>
      <td>
        <%= f.text_field :check_in_date, id: check_in_date_id,  placeholder: "Check In Date" %></td>
      <td><%= f.text_field :check_out_date, id: check_out_date_id, placeholder: "Check Out Date" %></td>
    </tr>
    <tr>
    <td colspan="1"><%= f.select(:source_of_booking, Reservation::SOURCE_OF_BOOKING, {}, {:style => "width:150px;", default: Reservation::SOURCE_OF_BOOKING[0]})  %></td>
      <td>
        <%= f.select(:bed_preference, @bed_options, {}, {:style => "width:100px;"}) %>
      </td>
    </tr>
   <% end %>

rails服务器提交表单的处理过程如下:

代码语言:javascript
运行
复制
Processing by ReservationsController#create as HTML

参数:{“utf8”=>“Queen”,"authenticity_token"=>"7Q3jakPp91bleWe1qZQFGRvYTXIxj9AdIYbeVtrF3bg=",“commit”=>“提交日期,预订来源&房间偏好”,“utf8”=>{“check_in_date”=>“2016年7月29日星期五”,“check_out_date”=>“2016年8月1日星期一”,"source_of_booking"=>"Email✓“,"bed_preference"=>"Queen"},"account_id"=>"5015"}

但是在Capybara中,select选项中的参数是缺失的,即使它们有默认值

代码语言:javascript
运行
复制
Started POST "/accounts/625262370/reservations" for 127.0.0.1 at 2016-07-25 18:23:59 -0500

由ReservationsController#create处理为HTML参数:{“utf8”=>“utf8”,"reservation"=>{"check_in_date"=>"2016-07-25","check_out_date"=>"2016-07-28"},“commit”=>“提交日期,预订来源和房间偏好”,"account_id"=>"625262370"}

测试代码不会抛出错误,直到最终的expect页面确认了文本,所以Capybara找到了选择框,但没有处理它。

代码语言:javascript
运行
复制
it "should add a new reservation for room category", :focus => true do
  fill_in('reservation[check_in_date]', :with => Date.today.to_s)
  fill_in('reservation[check_out_date]', :with => (Date.today + 3).to_s)
  select 'Twin', :from => 'reservation[bed_preference]'
  click_button("Submit Dates, Source of Booking & Room Preference")
  expect(page).to have_text("CONFIRMED")
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-26 13:13:58

根据您在测试期间使用的驱动程序和/或浏览器的不同,可以/将对无效的html进行不同的解释。您拥有的表单片段将生成一个元素,其中的元素作为子元素(在tr元素周围似乎还缺少一个start date元素)。元素不是元素的有效子元素,并且元素仅作为、、和元素的子元素有效,因此要使元素有效,您的代码片段必须如下所示

代码语言:javascript
运行
复制
<%= form_for(@reservation, :url => account_reservations_path(account.id), remote: false, :html=>{:id=>'dates_form'}) do |f| %>
  <table>       
    <tr>
      <td style:"text-align:center" colspan="2"><%= f.submit 'Submit Dates, Source of Booking & Room Preference', class: "btn btn-primary btn-sm" %></td>
    </tr>
    <tr>
      <td><%= f.text_field :check_in_date, id: check_in_date_id,  placeholder: "Check In Date" %></td>
      <td><%= f.text_field :check_out_date, id: check_out_date_id, placeholder: "Check Out Date" %></td>
    </tr>
    <tr>
      <td colspan="1"><%= f.select(:source_of_booking, Reservation::SOURCE_OF_BOOKING, {}, {:style => "width:150px;", default: Reservation::SOURCE_OF_BOOKING[0]})  %></td>
      <td>
        <%= f.select(:bed_preference, @bed_options, {}, {:style => "width:100px;"}) %></td>
    </tr>
   </table>
 <% end %>

如果没有有效的HTML,可能某些字段实际上被认为在表单之外,因此不会随表单一起提交。我猜你是在你的开发和生产系统上使用Chrome,因为它对无效表的解释往往要宽松得多,如果你在你的开发和生产系统上尝试firefox,你会发现它不起作用,因为它对无效表的解释往往不那么宽松。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38578688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档