Rails,水豚 - click_link 远程链接不起作用
Rails, Capybara - click_link on remote links doesnt work
我正在使用 Capybara 来测试我的项目。但我有一个问题。
我的项目中有一些远程表单。他们通过 ajax 添加记录。当我使用水豚进行测试时,它在开发环境中运行良好。它访问页面,填写表格并提交。砰,记录已添加,测试没有失败。
但是当我在测试环境中 运行 rspec 时,我遇到了未知格式异常。
1) add new address user adds new address
Failure/Error: find("input[value='Adres Ekle']").click
ActionController::UnknownFormat:
Account::AddressesController#create is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []
# ./spec/features/user_add_new_address_spec.rb:28:in `block (2 levels) in <top (required)>'
我也试过通过来自控制器的 js 响应,例如;
def create
request.format = :js
end
然后呢returns;
1) add new address user adds new address
Failure/Error: find("input[value='Adres Ekle']").click
ActionController::UnknownFormat:
Account::AddressesController#create is missing a template for this request format and variant.
request.formats: ["text/javascript"]
request.variant: []
# ./spec/features/user_add_new_address_spec.rb:28:in `block (2 levels) in <top (required)>'
如果您想了解更多信息,还有我的场景;
scenario 'user adds new address' do
expect(page).to have_content 'Kayıtlı Adreslerim'
find("a[title='Adres Ekle']").click
expect(page).to have_content 'Yeni Adres Ekle'
expect(page).to have_content 'Adres Başlığı'
fill_in 'address[name]', with:'Izmir Ofisi'
select('Izmir', :from => 'address[city_id]')
fill_in 'address[address]', with: 'Lorem ipsum dolor sit amet.'
find("input[value='Adres Ekle']").click # It submits remote: true form.
expect(page).to have_content 'Success!'
end
PS:我的创建操作不会呈现类似的内容。
喜欢;
def create
@new_address = Address.new
@address = @current_account.addresses.new(address_params)
if @address.save
@check = true
else
@check = false
end
end
它呈现:create.js.erb
<% if @check %>
if($('.addresses').length) {
$('.addresses').append('<%= j(render('account/addresses/address', address: @address)) %>');
}
if($('#did-addresses').length){
$('#did-addresses').append("<%= "<option selected='true' value='#{@address.id}'>#{@address.name}</option>".html_safe %>").selectpicker('refresh');
}
$('#new-address').html('<%= j(render('account/addresses/form', new_address: @new_address)) %>');
swal({
type: 'success',
title: "<%= t('response.success') %>",
text: "<%= t('flash.actions.create.notice', resource_name: Address.model_name.human) %>",
timer: 2000
});
quickview.close('#new-address');
<% else %>
<% @address.errors.each do |error| %>
<% end %>
<% end %>
$('.preloader').fadeOut();
由于将开发配置复制到测试配置上解决了您的问题,听起来您的某个 JS 文件中可能存在错误。通常在测试和生产环境中,所有 JS 资产都被连接到一个文件中,这意味着其中任何一个的错误都会阻止其他文件中的代码被执行。在开发环境中,每个 JS 文件都是单独加载的,这意味着任何文件中的错误只会影响该文件中的其余代码。转到有问题的页面时,请检查浏览器中的控制台是否有任何 JS 错误并修复它们。
我在 rails 6 中遇到了同样的情况,但我修复了将 js: true
添加到 场景 并且它自动运行良好。
scenario 'Should delete the feature', js: true do
# Your logic
# Your expectations
end
我正在使用 Capybara 来测试我的项目。但我有一个问题。 我的项目中有一些远程表单。他们通过 ajax 添加记录。当我使用水豚进行测试时,它在开发环境中运行良好。它访问页面,填写表格并提交。砰,记录已添加,测试没有失败。 但是当我在测试环境中 运行 rspec 时,我遇到了未知格式异常。
1) add new address user adds new address
Failure/Error: find("input[value='Adres Ekle']").click
ActionController::UnknownFormat:
Account::AddressesController#create is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []
# ./spec/features/user_add_new_address_spec.rb:28:in `block (2 levels) in <top (required)>'
我也试过通过来自控制器的 js 响应,例如;
def create
request.format = :js
end
然后呢returns;
1) add new address user adds new address
Failure/Error: find("input[value='Adres Ekle']").click
ActionController::UnknownFormat:
Account::AddressesController#create is missing a template for this request format and variant.
request.formats: ["text/javascript"]
request.variant: []
# ./spec/features/user_add_new_address_spec.rb:28:in `block (2 levels) in <top (required)>'
如果您想了解更多信息,还有我的场景;
scenario 'user adds new address' do
expect(page).to have_content 'Kayıtlı Adreslerim'
find("a[title='Adres Ekle']").click
expect(page).to have_content 'Yeni Adres Ekle'
expect(page).to have_content 'Adres Başlığı'
fill_in 'address[name]', with:'Izmir Ofisi'
select('Izmir', :from => 'address[city_id]')
fill_in 'address[address]', with: 'Lorem ipsum dolor sit amet.'
find("input[value='Adres Ekle']").click # It submits remote: true form.
expect(page).to have_content 'Success!'
end
PS:我的创建操作不会呈现类似的内容。 喜欢;
def create
@new_address = Address.new
@address = @current_account.addresses.new(address_params)
if @address.save
@check = true
else
@check = false
end
end
它呈现:create.js.erb
<% if @check %>
if($('.addresses').length) {
$('.addresses').append('<%= j(render('account/addresses/address', address: @address)) %>');
}
if($('#did-addresses').length){
$('#did-addresses').append("<%= "<option selected='true' value='#{@address.id}'>#{@address.name}</option>".html_safe %>").selectpicker('refresh');
}
$('#new-address').html('<%= j(render('account/addresses/form', new_address: @new_address)) %>');
swal({
type: 'success',
title: "<%= t('response.success') %>",
text: "<%= t('flash.actions.create.notice', resource_name: Address.model_name.human) %>",
timer: 2000
});
quickview.close('#new-address');
<% else %>
<% @address.errors.each do |error| %>
<% end %>
<% end %>
$('.preloader').fadeOut();
由于将开发配置复制到测试配置上解决了您的问题,听起来您的某个 JS 文件中可能存在错误。通常在测试和生产环境中,所有 JS 资产都被连接到一个文件中,这意味着其中任何一个的错误都会阻止其他文件中的代码被执行。在开发环境中,每个 JS 文件都是单独加载的,这意味着任何文件中的错误只会影响该文件中的其余代码。转到有问题的页面时,请检查浏览器中的控制台是否有任何 JS 错误并修复它们。
我在 rails 6 中遇到了同样的情况,但我修复了将 js: true
添加到 场景 并且它自动运行良好。
scenario 'Should delete the feature', js: true do
# Your logic
# Your expectations
end