使用remote提交表单时如何编写功能规范:true

时间:2016-08-11 10:55:00

标签: rspec capybara capybara-webkit

我对RSpec很新,只是开始测试一些东西。

我有一个带有"远程的表单: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 个答案:

答案 0 :(得分:3)

您不应该检查功能测试中的响应类型,只需检查您希望在屏幕上发生的更改是否发生(在大多数情况下,您也确实不应该直接检查数据库中的计数)。如果您在通常推荐的庄园中设置了capybara,rspec和database_cleaner(并选择了一个支持javascript的驱动程序 - 默认为selenium)那么您的测试将类似于

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