我的测试套件有一个小麻烦:当我运行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
调用也等待相关元素出现之前执行他们的动作
正如您所说,这是一个竞争条件。至于为什么会这样,我真的说不清楚,我能想到的唯一原因是用户体验和自动测试之间存在差异,因为计算机非常快。
我曾经面对过同样的挑战,我发现这个教程向我展示了解决这些问题的方法。我希望这对你也有用。