轨道上的红宝石 - 为什么水豚功能测试不等待?



我的测试套件有一个小麻烦:当我运行spec检查页面上的ajax动作时,有时我会得到随机错误

Failure/Error: expect(page).to have_content 'DHH'

这个错误很少出现(大约1/100),但这让我很困惑。我决定这是一个'竞争条件'的原因,我添加这个配置在我的spec/rails_helper.rb

Capybara.default_max_wait_time = 10

但是这对我没有帮助,我决定添加时间戳

  it 'adds new DHH', js: true do
    find('#modal_new_dhh').click
    fill_in('name', with: 'DHH')
    p 'click button'
    p Time.now.strftime('%H:%M:%S.%L')
    click_button('Submit')
    p 'checking content'
    p Time.now.strftime('%H:%M:%S.%L')
    expect(page).to have_content 'DHH'
    p 'after checking content'
    p Time.now.strftime('%H:%M:%S.%L')
  end

看到

"click button"
"17:34:43.083"
"before checking content"
"17:34:43.127"
"after checking content"
"17:34:43.213"

为什么水豚点击按钮后不等待?

对不起,我的英语不好

示例中的等待发生在have_content匹配器中。输出时间的地方永远不会显示延迟,因为click_button没有什么可等待的,它只是单击按钮并继续前进(因为它不知道要等待什么,单击按钮可以做任何事情),但是have_content匹合器将等待到Capybara.default_max_wait_time以显示内容。

注意你的find, 'fill_in'和click_button调用也等待相关元素出现之前执行他们的动作

正如您所说,这是一个竞争条件。至于为什么会这样,我真的说不清楚,我能想到的唯一原因是用户体验和自动测试之间存在差异,因为计算机非常快。

我曾经面对过同样的挑战,我发现这个教程向我展示了解决这些问题的方法。我希望这对你也有用。

最新更新