在Rails 4功能规范中,使用RSpec 3和Capybara,如何判断页面中是否存在特定数量的特定标签?
我试过了:
expect(find('section.documents .document').count).to eq(2)
但它不起作用,说:
Ambiguous match, found 2 elements matching css "section.documents .document"
另外,在功能规范中测试一些特定的东西(视图中使用的标签和类的类型)是一个好主意/不好的做法吗?
答案 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)