2016-07-25 9 views
0

Ich teste ein Formular in einer Rails App mit Capybara.capybara nicht übergeben Parameter auswählen

Das Formular enthält 2 Auswahlfelder mit jeweils Standardoptionen. Diese Optionen werden als Parameter übergeben, wenn das Formular in Entwicklung und Produktion eingereicht wird. Capybara übermittelt sie jedoch aus irgendeinem Grund nicht zu Testzwecken. Capybara findet die Auswahlfelder und die Optionen OK, denn wenn ich in nicht vorhandene Optionen einlege, löst ein Fehler aus. Capybara übergibt jedoch weder eine Standardoption noch eine ausgewählte Option als Parameter, wenn das Formular übermittelt wird.

Die Form Schnipsel ist wie folgt:

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

Die Verarbeitung der Formularübermittlung durch die Schienen-Server ist wie folgt:

Processing by ReservationsController#create as HTML 

Parameter: { "utf8 "=>" ✓ "," authenticity_token "=>" 7Q3jakPp91bleWe1qZQFGRvYTXIxj9AdIYbeVtrF3bg = "," commit "=>" Datum einreichen, Quelle der Buchung & Zimmerpräferenz "," Reservierung "=> {" check_in_date "=>" Freitag, 29. Juli 2016 "," check_out_date "=>" Montag, 1. August 2016 "," source_of_booking "=>" Email Direct "," bed_preference "=>" Queen "}, "account_id"=>" 5015" }

Aber in Capybara die Parameter aus den Auswahloptionen fehlen, auch wenn sie Standardwerte haben

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

Verarbeitung von ReservationsController #create as HTML Parameter: {"utf8" => "✓", "Reservierung" => {"check_in_date" => "2016-07-25", "check_out_date" => "2016-07-28"}, "commit" => "Daten einreichen, Quelle der Buchung & Raumpräferenz", "account_id" => "625262370"}

Der Testcode gibt keinen Fehler aus, bis die endgültige Seite den Text bestätigt hat. Capybara findet die Auswahlbox, verarbeitet sie aber nicht.

+0

Welchen Treiber verwenden Sie mit Capybara? –

Antwort

0

Je nachdem, welchen Treiber und/oder Browser Sie beim Testen verwenden, kann ungültiges HTML unterschiedlich interpretiert werden. Das Formular-Snippet, das Sie haben, wird ein < form> -Element mit < tr> -Elementen als untergeordnete Elemente (Sie scheinen auch ein Start tr -Element um die Datumselemente zu fehlen). < form> Elemente sind nicht gültig Kinder von < tr> Elemente und < tr> Elemente sind nur gültig als Kinder von < Tabelle>, < thead>, < tbody>, und < tfoot> Elemente, so dass Ihr Schnipsel gültig wäre so etwas wie

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

Ohne gültige HTML zu sein ist es möglich, einige Felder sind tatsächlich außerhalb der Form zu sein, betrachtet und sind daher nicht mit ihm unterbreitet. Ich nehme an, dass Sie Chrome mit Ihren Entwicklungs- und Produktionssystemen verwendet haben, da es bei der Interpretation von ungültigen Tabellen viel nachsichtiger ist. Wenn Sie Firefox auf Ihren Entwicklungs- und Produktionssystemen testen, werden Sie feststellen, dass es seitdem nicht mehr funktioniert es neigt dazu, für ungültige Tabellen viel weniger nachsichtig zu sein.

+0

Vielen Dank Tom, das war offensichtlich das Problem. Meine

Elemente waren außerhalb des Formulars, und ich hatte diese nicht in das Code-Snippet aufgenommen.Ich habe diese jetzt in das Formular gebracht, und Capybara übermittelt nun erfolgreich die Auswahlbox-Parameter. –

+0

@WillM Gern geschehen. Zu Ihrer Information - https://www.w3.org/TR/html5/tabular-data.html#the-table-element - steht die Tabelle element spec. Technisch ist das Inhaltsmodell ein wenig mehr als ich in meiner Antwort angegeben habe, aber der Geist meiner Antwort ist richtig –

Verwandte Themen