我们有一些功能规格偶尔会失败,重新运行修复。我有很多测试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
更改的正确方法是什么?
答案 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)