如何使用RSpec检查页面中有多少特定HTML元素?

时间:2014-08-27 13:00:34

标签: testing ruby-on-rails-4 tdd capybara rspec3

在Rails 4功能规范中,使用RSpec 3和Capybara,如何判断页面中是否存在特定数量的特定标签?

我试过了:

expect(find('section.documents .document').count).to eq(2)

但它不起作用,说:

Ambiguous match, found 2 elements matching css "section.documents .document"

另外,在功能规范中测试一些特定的东西(视图中使用的标签和类的类型)是一个好主意/不好的做法吗?

1 个答案:

答案 0 :(得分:4)

使用find的问题在于它意味着返回单个匹配元素。要查找可以计算的所有匹配元素,您需要使用all

expect(all('section.documents .document').count).to eq(2)

但是,这种方法没有使用Capybara的等待/查询方法。这意味着如果元素是异步加载的,则断言可能会随机失败。例如,all检查存在多少元素,元素完成加载,然后断言将失败,因为它将0比2进行比较。相反,最好使用:count选项,等待直到指定数量的元素存在。

expect(all('section.documents .document', count: 2).count).to eq(2)

此代码中存在一些冗余,并且断言消息会有点奇怪(因为会有异常而不是测试失败),所以最好还切换到使用have_selector:< / p>

expect(page).to have_selector('section.documents .document', count: 2)