我在测试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次)
答案 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