【问题标题】:Rails, Capybara - click_link on remote links doesnt workRails,Capybara - 远程链接上的 click_link 不起作用
【发布时间】:2017-11-10 11:02:04
【问题描述】:

我正在使用 Capybara 来测试我的项目。但我有一个问题。 我的项目中有一些远​​程表单。他们通过 ajax 添加记录。当我使用 capybara 进行测试时,它在开发环境中运行良好。它访问页面,填写表格并提交。砰,记录已添加,测试没有失败。 但是当我在测试环境中运行 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

然后返回;

 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();

【问题讨论】:

  • remote: true 如果jquery-ujs(Rails 不显眼的 javascript 驱动程序)不起作用,将退回到纯 html 请求。 Capybara 使用的是哪个驱动程序?
  • irb(main):001:0> Capybara.current_driver => :rack_test irb(main):002:0> Capybara.javascript_driver => :selenium 这些对于开发和测试环境。
  • 你试过添加scenario 'user adds new address', javascript: true do吗?如果测试是用 rack test 运行的,它会解释它,因为 rack test 不运行 js。
  • 您可能需要进行一些调试和研究才能正确设置测试,但现在您知道错误的原因了。
  • 我以某种方式修复了它,但我不喜欢我的解决方案。我已将 development.rb 中的所有代码复制到 test.rb 并更改了一些变量。然后tataaa它起作用了!还是谢谢。

标签: ruby-on-rails rspec capybara rspec-rails


【解决方案1】:

我在 rails 6 中遇到了同样的情况,但我修复了它,将 js: true 添加到 scenario 并且它自动运行良好。

  scenario 'Should delete the feature', js: true do
    # Your logic
    # Your expectations
  end

【讨论】:

    【解决方案2】:

    由于将您的开发配置复制到您的测试配置解决了您的问题,听起来您的 JS 文件之一可能有错误。通常在测试和生产环境中,您的所有 JS 资产都会连接到一个文件中,这意味着其中任何一个中的错误都会阻止其他代码中的代码被执行。在开发环境中,每个 JS 文件都是单独加载的,这意味着任何文件中的错误只会影响该文件中的其余代码。访问相关页面时,检查浏览器中的控制台是否有任何 JS 错误并进行修复。

    【讨论】:

    • 你也可以创建一个烟幕测试,用expect(page).not_to have_errors检查js错误。
    • @max IIRC 仅在使用 capybara-webkit 作为驱动程序时才有效
    • 我今天试试,让你知道结果。非常感谢!
    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多