2016-07-25 9 views
0

私はCapybaraを使用してRailsアプリケーションでフォームをテストしています。capybaraが選択したパラメータを渡さない

フォームには2つの選択ボックスがあり、それぞれデフォルトオプションがあります。これらのオプションはフォームが開発と生産で提出されたときにパラメータとして渡されますが、何らかの理由でCapybaraがテストでそれらを提出していません。私が存在しないオプションをスローするとエラーが出るので、Capybaraは選択ボックスとオプションを見つけることができます。しかし、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 = "、"コミット "=>"予約日、提出先"check_in_date" => "Friday、29 July、2016"、 "check_out_date" => "2016年8月1日月曜日"、 "source_of_booking" => "Email Direct"、 " ReservationsControllerによってbed_preference "=>" 女王 "}、 "ACCOUNT_ID"=>" 5015" }

しかし、カピバラに選択したオプションのパラメータが欠落している、彼らはデフォルト値を持っているにもかかわらず

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

処理"" 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は異なる解釈が可能です。あなたが持っているフォームスニペットは子として< tr>要素を持つ<フォーム>要素を生成します(また、日付要素の周りに開始tr要素がないようです)。 < thead>、< tbody>、< tfoot>要素の子としてのみ有効であるため、スニペットには有効なHTMLなし

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

のようなものにするために、それはいくつかのフィールドが実際にフォーム外にあると考えられているので、それに提出されていないことが可能です。私はあなたがdevテーブルとproductionシステムでChromeを使用していたと推測しています。なぜなら、無効なテーブルの解釈にはもっと寛大な傾向があるからです。開発者や運用システムでfirefoxを試してみると、それは、無効なテーブルに対してはあまり寛大ではありません。

+0

ありがとうTom、それは明らかに問題でした。私の

の要素はフォームの外にあり、コードスニペットにはこれを含めていませんでした。私はこれらのフォームを今のフォームに持ってきました。そして、Capybaraはセレクトボックスのパラメータを正常に提出しています。 –

+0

@WillMよろしくお願いします。参考までに - https://www.w3.org/TR/html5/tabular-data.html#the-table-element - は表要素の仕様です。技術的には、コンテンツモデルは私の答えで指定したものよりも少しですが、私の答えの精神は正しい –

関連する問題