2016-07-25 6 views
0

Я тестирую форму в приложении Rails, используя Capybara.capybara не передает параметры выбора

Форма имеет 2 блока выбора, каждый по умолчанию. Эти параметры передаются как параметры, когда форма представлена ​​в процессе разработки и производства, но по какой-то причине Capybara не отправляет их при тестировании. Capybara находит флажки для выбора и опции OK, потому что если я поставлю несуществующие опции, это вызовет ошибку. Но 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 "=>" Отправить даты, источник бронирования & «Предпочтение номеров», «бронирование» => {«check_in_date» => «Пятница, 29 июля 2016 года», «check_out_date» => «Понедельник, 1 августа 2016 года», «source_of_booking» => «Email Direct», bed_preference "=>" Queen "}, "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

Какой драйвер вы используете с Capybara? –

ответ

0

В зависимости от того, какой драйвер и/или браузер вы используете во время тестирования, неверный html может/будет интерпретироваться по-разному. У вашего фрагмента формы будет сформирован элемент <> с элементами < tr> в качестве дочерних элементов (вам также кажется, что отсутствует элемент tr вокруг элементов даты). < форма> элементы не действительны дети < 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 в своих dev и производственных системах, поскольку он имеет тенденцию быть более мягким в интерпретации недопустимых таблиц, и если вы попробуете firefox на своих dev и производственных системах, вы обнаружите, что он не работает с тех пор он имеет тенденцию быть менее мягким для недопустимых таблиц.

+0

Спасибо, Том, это, очевидно, проблема. Мои

элементы были вне формы, и я не включил их в фрагмент кода.Я привел их в форму сейчас, и Capybara теперь успешно отправляет параметры блока выбора. –

+0

@WillM Добро пожаловать. Для справки - https://www.w3.org/TR/html5/tabular-data.html#the-table-element - спецификация элемента таблицы. Технически модель контента немного больше, чем я указал в своем ответе, но дух моего ответа правильный –

Смежные вопросы