2016-07-25 85 views
0

我正在使用Capybara在Rails應用程序中測試表單。水豚不通過選擇參數

表單有2個選擇框,每個框都有默認選項。這些選項在開發和生產中提交表單時作爲參數傳遞,但由於某些原因,Capybara未將其提交到測試中。水豚是找到選擇框和選項確定,因爲如果我把不存在的選項放在一個錯誤。但是,在提交表單時,水豚不會將默認或選定的選項作爲參數傳遞。

形式片段如下:

<%= 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 %>

由軌道服務器表單提交的處理如下:

Processing by ReservationsController#create as HTML 

參數:{「UTF8 「=>」✓「,」authenticity_token「=>」7Q3jakPp91bleWe1qZQFGRvYTXIxj9AdIYbeVtrF3bg =「,」commit「=>」提交日期,預訂來源& Room Preference「,」reservation「=> {」check_in_date「=>」2016年7月29日星期五「,」check_out_date「=>」2016年8月1日星期一「,」source_of_booking「=>」電子郵件直撥「,」 bed_preference 「=>」 女王 「}, 」ACCOUNT_ID「=>」 5015" }

但在水豚從選擇選項的參數丟失,即使他們有默認值

Started POST "/accounts/625262370/reservations" for 127.0.0.1 at 2016-07-25 18:23:59 -0500 

處理由ReservationsController #create as HTML 參數:{「utf8」=>「✓」,「reservation」=> {「check_in_date」=>「2016-07-25」,「check_out_date」=>「2016-07-28」}, 「commit」=>「提交日期,預訂來源&房間首選項」,「account_id」=>「625262370」}

測試代碼在最終期望頁面有文本確認之前不會拋出錯誤,因此Capybara正在查找選擇框但未處理它。

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 
+0

你用什麼驅動程序與水豚? –

回答

0

根據您在測試過程中使用的驅動程序和/或瀏覽器,無效的html會被解釋爲不同的。您所擁有的表格片段將會生成一個< form>元素,其中< tr>元素作爲子元素(您似乎也缺少圍繞日期元素的開始tr元素)。 < form>元素不是< tr>元素的有效子元素,< tr>元素只對<表>,< thead>,< tbody>和< tfoot>元素的子元素有效,因此要使代碼片段有效要像

<%= 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

非常感謝湯姆,這顯然是問題所在。我的

元素在表單之外,我沒有將它們包含在代碼片段中。現在我已經把這些內容帶到了表單中,而且水豚現在已經成功提交了選擇框參數。 –

+0

@WillM不客氣。供您參考 - https://www.w3.org/TR/html5/tabular-data.html#the-table-element - 是表格元素規範。從技術上講,內容模型比我在答案中指出的要多一點,但我的答案的精神是正確的 –