使用Capybara / Rspec的间歇性失败功能测试:期望{click}。更改{...}

时间:2018-01-29 16:09:31

标签: ruby-on-rails rspec capybara

我们有一些功能规格偶尔会失败,重新运行修复。我有很多测试Capybara计时的经验,但在这种特殊情况下,我并不确定如何解决它。试图通过网络搜索这一点令人惊讶地无效。

我们的代码失败了:

expect {
  click_on 'Save'
}.to change { Report.count }.from(1).to(2)

我可以通过几种不同的方式来做到这一点:

expect(Report.count).to eq 1
click_on 'Save'
expect(Report.count).to eq 2

或者也许:

expect(Report.count).to eq 1
click_on 'Save'
expect(page).to have_something
expect(Report.count).to eq 2

但鉴于这些测试失败如此随机且不经常,我们很难测试我们是否正确行事。

根据Capybara的点击验证count更改的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

首先,直接数据库检查功能/系统测试(我假设你正在写的是因为你使用Capybara通常是一个糟糕的代码味道,因为你通常应该通过视觉上的变化验证事物页面(它们对请求/控制器测试更有意义)。

如果您坚持进行直接数据库功能测试,则仍需要使用可视化检查来同步这些检查。这是因为click_on之类的操作不知道这些点击启动的任何进一步的浏览器操作,并且可以在点击后立即返回。由于count实际上已被更改,直到处理请求之后,您需要延迟直到该请求完成(通常通过等待显示已完成的可见页面更改来完成)。因此,正确的方法是

expect(Report.count).to eq 1
click_on 'Save'
expect(page).to have_something # wait for something that indicates the request triggered by click_on has completed
expect(Report.count).to eq 2

也可以写成

expect {
  click_on 'Save'
  expect(page).to have_something
}.to change { Report.count }.from(1).to(2) 

或更灵活地

expect {
  click_on 'Save'
  expect(page).to have_something
}.to change { Report.count }.by(1)