如何使用Capybara检查是否列出了正确的物品?

时间:2012-05-09 21:35:06

标签: ruby capybara

我正在尝试使用Capybara来测试列表中是否包含正确的项目。例如:

<table id="rodents">
  <tr><td class="rodent_id">1</td><td class="rodent_name">Hamster</td></tr>
  <tr><td class="rodent_id">2</td><td class="rodent_name">Gerbil</td></tr>
</table>

此列表包含ID 1和2,但不应包含3。

我想要的是:

ids = ? # get the contents of each row's first cell
ids.should include(1)
ids.should include(2)
ids.should_not include(3)

我该怎么办?

我正在回答我找到的一些令人不满意的解决方案,但我希望看到更好的解决方案。

4 个答案:

答案 0 :(得分:7)

这是一个略微简化的表达式:

  rodent_ids = page.all('table#rodents td.rodent_id').map(&:text)

从那里,你可以进行比较。

  rodent_ids.should include(1)
  rodent_ids.should include(2)
  rodent_ids.should_not include(3)

答案 1 :(得分:2)

寻找特定的行和ID

一个糟糕的解决方案:

within ('table#rodents tr:nth-child(1) td:nth-child(1)') do
  page.should have_content @rodent1.id
end

within ('table#rodents tr:nth-child(2) td:nth-child(1)') do
  page.should have_content @rodent1.id
end

page.should_not have_selector('table#rodents tr:nth-child(3)')

这是冗长而丑陋的,并不是说id 3不应该出现在表格中。

答案 2 :(得分:2)

将ID收集到数组

这就是我想要的:

  rodent_ids = page.all('table#rodents td:nth-child(1)').map{|td| td.text}

从那里,我可以做到:

  rodent_ids.should include(1)
  rodent_ids.should include(2)
  rodent_ids.should_not include(3)

或者只是:

  rodent_ids.should eq(%w[1 2])

答案 3 :(得分:0)

使用has_table?

一个糟糕的解决方案:

  page.has_table?('rodents', :rows => [
                    ['1', 'Hamster'],
                    ['2', 'Gerbil']   
                  ]
                 ).should be_true

这一点非常清楚,但是:

  • 很脆弱。如果表结构或文本发生了变化,则会失败。
  • 如果它失败了,它只是说它预期是假的;除了print page.html
  • 之外,我不知道一种简单的方法来比较表格的真实情况和预期的情况。
  • has_table?方法might get removed at some point