当使用capybara-webkit或poltergeist测试JavaScript行为时,我经常发现(或不幸的是,写)看起来像这样的测试
it "saves the check box value when clicked", js: true do
visit '/somewhere'
page.should have_unchecked_field 'cool_check_box'
page.check 'cool_check_box'
visit '/somewhere'
page.should have_checked_field 'cool_check_box'
end
...在选中该复选框时会发出一些AJAX请求,该请求会保存在快速重新加载后允许检查的状态。
该测试看起来似乎有问题,因为如果AJAX请求在第二个visit '/somewhere'
发生时没有完成,它将加载错误状态的复选框。
幸运的是,在这个页面上还有一个旋转器在复选框请求完成时旋转,所以我可以像这样修改测试
it "saves the check box value when clicked", js: true do
visit '/somewhere'
page.should have_unchecked_field 'cool_check_box'
page.check 'cool_check_box'
# Wait for checkbox ajax to complete
page.should have_css('.spinner:not(.active)')
visit '/somewhere'
page.should have_checked_field 'cool_check_box'
end
我仍然有点偏执:如果page.check
行已经运行但未能在active
行之前将微调器设置为page.should have_css
,那么该行就会成功在请求开始之前。
鉴于复选框触发的JavaScript设置了active
类,我可以保证此测试永远不会剥落吗?
答案 0 :(得分:2)
您所谈论的是代码处理检查事件的风险,该代码同时运行 运行检查.spinner:not(.active)
的代码。这不是风险,因为页面上的Javascript是单线程的 - 您可以保证甚至将首先处理检查。