水豚测试 - 替代睡眠

时间:2016-09-29 18:25:04

标签: ruby-on-rails capybara

我一直试图找到使用睡眠的替代方案已经有一段时间了,而且似乎每一种避免使用睡眠的建议方法都无法正常工作,我就在绳子的最后。

it 'finds the correct product when searching by job type', js: true do
    fill_in('filterrific_for_work_type', with: 'Central')
    # once again, sleep feels like the only thing that works
    #sleep 1 # TODO: find a better way..
    expect(find('#work_queue_items_filter_reset')).to have_content('Reset All Filters')
    expect(page).to have_link('IP Central Report',
                              href: work_queue_item_path(@release.id))
  end

我也有等待ajax助手:

module CapybaraHelpers
  def wait_for_ajax
    Timeout.timeout(Capybara.default_max_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

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

在spec_helper.rb中:

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

除非我添加睡眠1,否则此测试会中断。我已尝试使用'''''','have_content'之类的内容进行如此多的迭代。这真让我疯狂。

2 个答案:

答案 0 :(得分:3)

只要在页面上进行了明显的更改,就几乎不需要wait_for_ajax。你没有确切地说出你得到了什么错误,但我写出你期望的方式将是

expect(page).to have_css('#work_queue_items_filter_reset', text: 'Reset All Filters')

如果这不起作用,那么可能只是你将Capybara.default_max_wait_time设置得太短而不适合你正在测试的硬件/应用程序。您可以通过在期望中指定自定义等待时间来测试它,看看它是否有所作为

expect(page).to have_css('#work_queue_items_filter_reset', text: 'Reset All Filters', wait: 10) # wait up to 10 seconds for matching element to appear

答案 1 :(得分:0)

你永远不应该使用"睡眠"与水豚。方法如 https://github.com/ordinaryzelig/capybara_minitest_spec

他们在里面睡觉。