Как написать спецификацию при отправке формы с удаленным: true
Я очень новичок в RSpec, только начинаю тестировать несколько вещей.
У меня есть форма с "remote: true" и я хочу написать спецификацию для этого.
.row
.col-md-offset-4.col-md-4.col-sm-offset-3.col-sm-6
= form_for @reading, html: {class: 'form-inline'}, remote: true do |f|
#error_box
.row
.col-md-9
.input-group.full-width
= f.text_field :label, class: 'form-control', placeholder: t('readings.new.lable_placeholder')
%span.input-group-addon mg/dl
.col-md-3
= f.submit t('readings.new.enter'), class: 'btn btn-success full-width'
#reading_panel
= render partial: 'reading_panel', locals: {readings: @readings}
Вот мой контроллер
def create
@reading = current_user.readings.create(reading_params)
end
create.js.erb, который повторно отображает партиалы.
<% if @reading.valid? %>
$("#reading_panel").html("<%= j render partial: 'reading_panel', locals: {readings: @readings} %>");
$("#reading_label").val('');
<% else %>
$("#error_box").html("<%= j render partial: 'shared/error_messages', locals: {reading: @reading} %>");
<% end %>
спецификации со следующим кодом
scenario "add a new reading" do
visit new_reading_url
within "#new_reading" do
fill_in "reading_label" , with:10
submit_button = page.find("input[type=submit][value='Enter']")
submit_button.click
expect(Reading.count).to eq(1)
end
end
Итак, я хочу спросить, как я могу проверить, что ответ является ответом js, и проверить, отображаются ли частичные данные внутри create.js.erb .
Любая помощь будет высоко ценится!!
1 ответ
Вы не должны проверять типы ответов в функциональных тестах, просто убедитесь, что изменения, которые вы ожидаете, произойдут на экране (в большинстве случаев вы также не должны напрямую проверять счетчики в базе данных). Если вы настроили capybara, rspec и database_cleaner в обычно рекомендуемой усадьбе (и выбрали драйвер с поддержкой javascript - по умолчанию - селен), тогда ваш тест будет выглядеть примерно так:
scenario "add a new reading", js: true do # in recommended config js: true tells the test to use Capybara.javascript_driver
visit new_reading_url
within "#new_reading" do
fill_in "reading_label" , with: '10'
click_button('Enter')
end
expect(page).to have_css('#reading_panel', text: '10') # assuming it just renders the submitted text into the panel
expect(page).to have_field('reading_label', with: '') # verify the input was cleared
end