使用 remote: true 提交表单时如何编写功能规范
How to write feature spec when submitting form with remote: 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 .
内渲染
任何帮助将不胜感激!!
您不应该检查功能测试中的响应类型,只需检查您期望在屏幕上发生的更改是否发生(在大多数情况下,您也不应该直接检查数据库中的计数)。如果您在通常推荐的庄园中设置了水豚、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
我对 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 .
内渲染任何帮助将不胜感激!!
您不应该检查功能测试中的响应类型,只需检查您期望在屏幕上发生的更改是否发生(在大多数情况下,您也不应该直接检查数据库中的计数)。如果您在通常推荐的庄园中设置了水豚、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