1

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

4

1 回答 1

2

您所说的是处理 check 事件代码与检查.spinner:not(.active). 这不是风险,因为页面上的 Javascript 是单线程的 - 您可以保证检查甚至会被首先处理。

于 2013-06-27T08:02:06.873 回答