我的系统测试失败,因为没有在测试环境中触发正确的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。
我在这里想念什么?
答案 0 :(得分:1)
检查浏览器控制台是否有其他JS错误,并进行修复。开发和测试环境之间的最大区别在于,JS资源在测试环境中被串联到一个文件中,这意味着一个JS中的错误可以阻止JS运行其他文件。在开发模式下不会发生这种情况,因为每个文件都是分别加载的,因此错误只会影响同一文件中的其他代码