Ruby on rails 水豚ajax竞争条件

Ruby on rails 水豚ajax竞争条件,ruby-on-rails,ruby-on-rails-3,rspec,tdd,capybara,Ruby On Rails,Ruby On Rails 3,Rspec,Tdd,Capybara,我经常在capybara中遇到请求测试失败的问题,因为capybara在继续之前没有等待ajax事件完成 谷歌似乎表示我应该在测试中使用:ressynchronize选项来解决这个问题。但它不起作用 为了证明这是一个问题,失败的测试可以通过在ajax调用之后放置sleep语句来修复。这似乎是一种不好的做法,因为适当的延迟将根据运行测试的机器的速度而变化。选择一个适当大的值将严重降低运行包含大量ajax操作的测试套件的速度 下面是失败/通过测试的示例。单击“保存”前的睡眠决定了页面上的通过/失败。

我经常在capybara中遇到请求测试失败的问题,因为capybara在继续之前没有等待ajax事件完成

谷歌似乎表示我应该在测试中使用:ressynchronize选项来解决这个问题。但它不起作用

为了证明这是一个问题,失败的测试可以通过在ajax调用之后放置sleep语句来修复。这似乎是一种不好的做法,因为适当的延迟将根据运行测试的机器的速度而变化。选择一个适当大的值将严重降低运行包含大量ajax操作的测试套件的速度

下面是失败/通过测试的示例。单击“保存”前的睡眠决定了页面上的通过/失败。应具有内容“自定义项”:

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
这是水豚里的虫子还是我做错了什么


感谢您的帮助……

我不久前遇到过这个问题,并使用这种方法来确定ajax请求何时完成:

wait_until do
  page.evaluate_script('$.active') == 0
end
仍然很黑,但比使用睡眠稍微好一点。我是从你那儿得到的。我将它用于Cucumber特性,但它也应该适用于rspec请求规范

更新6/19/2013

在版本2.0中从Capybara中删除之前,请参阅:了解原因的详细信息

我遵循其中一条建议并实施了它,仅针对我认为合理的一个案例:

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

不久前,我遇到了这个问题,并使用这种方法来确定ajax请求何时完成:

wait_until do
  page.evaluate_script('$.active') == 0
end
仍然很黑,但比使用睡眠稍微好一点。我是从你那儿得到的。我将它用于Cucumber特性,但它也应该适用于rspec请求规范

更新6/19/2013

在版本2.0中从Capybara中删除之前,请参阅:了解原因的详细信息

我遵循其中一条建议并实施了它,仅针对我认为合理的一个案例:

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

谢谢,这比随意睡觉好多了!谢谢,这比随意睡觉好多了!