在使用 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
类,我能保证这个测试永远不会失败吗?