这个Capybara会测试片吗?

时间:2013-06-27 01:04:31

标签: javascript rspec capybara capybara-webkit poltergeist

当使用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类,我可以保证此测试永远不会剥落吗?

1 个答案:

答案 0 :(得分:2)

您所谈论的是代码处理检查事件的风险,该代码同时运行 运行检查.spinner:not(.active)的代码。这不是风险,因为页面上的Javascript是单线程的 - 您可以保证甚至将首先处理检查。