Как написать спецификацию при отправке формы с удаленным: 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
Другие вопросы по тегам