为什么在Rails系统测试中不会触发“ ajax:success”事件?

时间:2018-12-04 16:21:28

标签: ruby-on-rails

我的系统测试失败,因为没有在测试环境中触发正确的ajax:success事件。在浏览器中手动测试时,会正确触发该事件。

这是用户(和测试)单击的链接:

link_to 'Note', note_product_option_path(@product, option), remote: true, data: { note_link: true }

JS(CoffeeScript)事件,它获取响应并插入到文档的body中:

NOTE_LINK = '[data-note-link="true"]'
$ ->
  $('body').on 'ajax:success', NOTE_LINK, (e) ->
    alert 'ajax:success'
    $('.option-note').remove()
    data = e.detail[2].response        
    $div = $('<div></div>').html(data)
      .addClass('option-note')
    $('body').append($div)

这是系统测试设置:

class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
  include Devise::Test::IntegrationHelpers

  Capybara.register_driver :headless_chrome do |app|
    options = Selenium::WebDriver::Chrome::Options.new
    options.add_argument('headless')
    options.add_argument('window-size=1480x1680')
    Capybara::Selenium::Driver.new(app, :browser => :chrome, :options => options)
  end
end

在我的系统测试中:

visit product_path(option.product)
click_link 'Note'
assert_selector '.option-note', wait: 5

即使在浏览器中进行测试时,该断言始终会起作用,但该断言始终会失败。 alert也不会被水豚捕获或触发,但在手动检查时始终会出现。测试日志显示控制器正在渲染正确的JS。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

检查浏览器控制台是否有其他JS错误,并进行修复。开发和测试环境之间的最大区别在于,JS资源在测试环境中被串联到一个文件中,这意味着一个JS中的错误可以阻止JS运行其他文件。在开发模式下不会发生这种情况,因为每个文件都是分别加载的,因此错误只会影响同一文件中的其他代码