为什么使用AJAX的rspec示例无法正常工作?

时间:2015-02-20 15:09:57

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

我遇到运行包含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

1 个答案:

答案 0 :(得分:0)

在capybara论坛上发帖后,我发现有些选择器已经等待异步通话完成,而有些人则没有。要让这个规范通过,我所要做的就是将期望更新到下面的

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

如果您遇到过这个并希望了解更多内容,请列出我传递的一些有用资源。