与Capybara的Rspec有时不通过测试

时间:2015-11-17 10:21:02

标签: ruby-on-rails ruby rspec capybara

我在测试Rails应用程序时遇到问题。我的测试通常完美无缺。但是,当我为模态引导程序窗口键入一些功能测试时,或者通过成功/错误[js]进行通知时,有时测试会失败。我该如何解决这个问题? 我使用Rspec,Capybara,Rails4.2,PhantomJs,Poltergeist作为JS驱动程序。测试在本地和Wercker进行。在测试模式下,每个引导程序动画都被禁用。或许我做错了什么? 测试:

scenario 'return deutsch default title' do
            find('.f-edit-item', match: :first).click
            find('a', :text => 'Lang').click
            find('a', :text => t('menu.languages.de')).click
            find('.f-reset-button', match: :first).click

            expect(page).to have_field('menu_item[title]', with: 'Exhibitions_de')
          end

输出: Objects Restore Language restore title translations exist for deutsch translation return deutsch default title Failure/Error: expect(page).to have_field('object_item[title]', with: 'Exhibitions_de') expected to find field "object_item[title]" with value "Exhibitions_de" but there were no matches. Also found "", "", which matched the selector but not all filters. 当我手动点击时,一切正常。当我运行此测试时,有时会通过,有时不会。表单是bootstrap模式。好奇心:当我在find('.f-reset-button', match: :first).click测试被传递之前添加save_and_open_page时(连续5次)

1 个答案:

答案 0 :(得分:1)

因为测试与Bootstrap模式有关,我猜测测试是在页面中搜索匹配的元素,直到模态加载到DOM中。

编辑:正如@TomWalpole指出的那样,应该足以覆盖Capybara的最长等待时间,如下所示:

expect(page).to have_field('menu_item[title]', with: 'Exhibitions_de', wait: 1.0)

但是如果你通过AJAX加载模态的内容,你可能需要等待AJAX​​来完成 expect 行。 Here is a good guide关于如何做到这一点。

特别需要:

# spec/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

然后你的测试将成为:

scenario 'return deutsch default title' do
  find('.f-edit-item', match: :first).click
  find('a', :text => 'Lang').click
  find('a', :text => t('menu.languages.de')).click
  find('.f-reset-button', match: :first).click
  wait_for_ajax
  expect(page).to have_field('menu_item[title]', with: 'Exhibitions_de')
end