我对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中被渲染。
任何帮助都将不胜感激!!
答案 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