是否可以通过RSpec/Capybara测试元素的顺序?

Joh*_*ohn 39 rspec capybara ruby-on-rails-3 ruby-on-rails-3.1

我正在使用RSpec/Capybara作为我的测试套件.我有一些动态附加<li>到j 的结尾的javascript <ul>.我想写一个请求规范来确保这种情况发生.

我尝试使用has_cssCapybara方法和高级CSS选择器来测试<li>元素的排序,但Capybara不支持+CSS选择器.

例:

page.should have_css('li:contains("ITEM #1")')
pseuo_add_new_li
page.should have_css('li:contains("ITEM #1")+li:contains("ITEM #2")')
Run Code Online (Sandbox Code Playgroud)

有没有人知道测试订购的另一种方法?

Joh*_*ohn 33

我通过测试针对页面正文内容的正则表达式匹配来解决此问题.有点kludgy,但它的工作原理.

page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,非常优雅的解决方案。我最终使用 ``expect(response.body).to match(/ITEM1.*ITEM2.*ITEM3/m)`` 与 RSpec 4 和多行匹配 (3认同)

dgi*_*rez 29

我发现了一种使用CSS测试此行为的更规范的方法.你可以用户:first-child,:last-child以及:nth-child(n)在哪个断言你喜欢的选择.

在你的例子中,我会尝试这些断言:

page.should have_tag("ul:last-child", :text => "ITEM #1")
pseuo_add_new_li
page.should have_tag("ul:nth-last-child(2)", :text => "ITEM #1")
page.should have_tag("ul:last-child", :text => "ITEM #2")
Run Code Online (Sandbox Code Playgroud)

我希望这可以帮助别人.阅读更多相关信息.

  • ``nth-last-child``从底部选择第n个孩子.http://www.quirksmode.org/css/nthlastchild.html (2认同)

小智 27

本文列出了几种在R​​Spec中测试排序顺序的方法,其中最好的方法似乎是这个匹配器:

RSpec::Matchers.define :appear_before do |later_content|
  match do |earlier_content|
    page.body.index(earlier_content) < page.body.index(later_content)
  end
end
Run Code Online (Sandbox Code Playgroud)


Tom*_*ila 5

我最近遇到了同样的问题,并找到了这个简洁而理想的解决方案:http : //launchware.com/articles/acceptance-testing-asserting-sort-order

它甚至被包装成一颗小宝石。


Jay*_* P. 5

您可以使用all finder 方法选择多个元素,然后使用collect 将文本提取到数组中:

assert_equal page.all('#navigation ul li').collect(&:text), ['Item 1', 'Item 2', 'Item 3']
Run Code Online (Sandbox Code Playgroud)

如果您的列表在页面上不可见(例如弹出导航菜单),则需要传递visible: false到该all方法。