水豚阿贾克斯的比赛条件(Capybara ajax race conditions)

2019-07-30 17:46发布

我经常与要求的测试失败,因为水豚是不是在等待AJAX​​事件在移动之前完成运行到问题的水豚。

谷歌似乎表明我应该使用:重新同步选项我的测试,以解决这个问题。 但它不工作。

为了证明这是一个问题,失败的测试可以通过将睡眠声明Ajax调用后确定。 这似乎哈克任何不好的做法,因为appropriote延迟将取决于运行测试机器的速度会有所不同。 并挑选适当大的值会严重减慢运行测试套件有很多AJAX动作。

一个失败/通过测试的一个例子是下面。 点击保存之前的睡眠,使路过的区别/失败的page.should have_content(“自定义项目”):

it "should be able create a new todo item", :js, :resynchronize, :focus do
  # Visit new action
  visit new_todo_list


  # Fill in the name
  fill_in "#name", "test list"

  # Click on add item to launch inline popup
  find('a.add-item').click
  within '#new_item' do
    fill_in 'todo_item_description', :with => 'custom item'
    # Run ajax action to add currrent item
    find('.btn').click
  end

  sleep(1)

  # Save
  find('a.save').click

  page.should have_content('test list')
  page.should have_content('custom item')

end

这是水豚或错误我做错了什么?

谢谢你的帮助...

Answer 1:

我有这个问题而回,并用这种方法计算出当Ajax请求完成:

wait_until do
  page.evaluate_script('$.active') == 0
end

尽管如此漂亮哈克,但比使用略好sleep 。 从我得到了它在这里 。 我使用它的黄瓜功能,但它应该在rspec的要求规格正常工作。

更新(2013年6月19日)

wait_until从水豚在2.0版本中删除,请参阅: 为什么wait_until从水豚删除的详细信息,这是为什么。

我已经遵循的一个建议和实施也无妨,只是这一个情况下(我认为是有道理的):

def wait_until
  require "timeout"
  Timeout.timeout(Capybara.default_wait_time) do
    sleep(0.1) until value = yield
    value
  end
end


文章来源: Capybara ajax race conditions