为什么带有 AJAX 的 rspec 示例无法正常工作?

Why is rspec example with AJAX not working correctly?

我在使用包含 ajax 的 运行 集成测试时遇到问题。

例如下面的测试

scenario 'displays next page when scrolling to the bottom of the page', js: true do
  scroll_to_bottom_of_page
  wait_for_ajax

  expect(all('.follow-up').count).to eq(30)
end

页面方法scroll_to_bottom的实现

def scroll_to_bottom_of_page
  page.execute_script "$('.off-canvas-wrap').scrollTo('.exit-off-canvas');"
end

wait_for_ajax 方法的实现

module WaitForAjax
  def wait_for_ajax
    Timeout.timeout(Capybara.default_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end
end

RSpec.configure do |config|
  config.include WaitForAjax, type: :feature
end

我基本上想测试我的无限滚动功能是否正常工作。

当我将脚本更改为以下内容时,它工作正常。

scenario 'displays next page when scrolling to the bottom of the page', js: true do
  scroll_to_bottom_of_page
  sleep 1

  expect(all('.follow-up').count).to eq(30)
end

这不是很可靠。如果 ajax 调用超过 1 秒怎么办。我不太喜欢随机添加睡眠 1、2 或 3。

如果能帮助找出 wait_for_ajax 的问题,我们将不胜感激。

谢谢。

我刚刚创建了一个测试应用程序。请查看

https://github.com/ryannealmes/capybara-bug

在水豚论坛上发帖后,我发现有些选择器等待异步调用完成,有些则没有。为了让这个规范通过,我所要做的就是将期望值更新为以下

expect(page).to have_css('.follow-up', count: 30)

下面列出了我传递的一些有用资源,如果您曾经 运行 了解此内容并想了解更多。