在Capybara Rails中等待重定向

时间:2014-08-13 16:48:44

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

我正在我的Spree内置网站上进行一些集成测试。我正在使用RSpec + Capybara进行这些测试。

我发现在较新版本的Capybara中,wait_until已从源代码中删除,因为不再需要以这种方式等待AJAX​​请求。不知何故,现在Capybara足够聪明,等待AJAX​​请求。

我正在做的很简单:

visit product_path(product)
  within '.vip-buy-content' do
    first('.buy-button').click
  end
expect(page.current_path).to eq(cart_path)

单击该按钮时,将完成AJAX请求。完成AJAX请求后,会发生重定向。

然而,期望失败,因为似乎Capybara将比AJAX请求和重定向更快地处理它。

如果在期望值之上添加“睡眠10”,则规范将通过,因为它有足够的时间来处理它。

我想要一种更好的方法来等待重定向。有什么想法?。

1 个答案:

答案 0 :(得分:1)

我不知道这是否能解决这个问题,但我通常会在support文件夹中添加一个wait_for_ajax.rb文件,并创建一个这样的模块。

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

然后添加

visit product_path(product)
  within '.vip-buy-content' do
    first('.buy-button').click
  end
  wait_for_ajax
expect(page.current_path).to eq(cart_path)

我在假设你正在使用:js =>在你的描述块上为true。希望这有帮助!