5

我正在尝试使用 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

4 回答 4

8

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

  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)
于 2012-05-10T01:22:27.957 回答
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 不应该在表中。

于 2012-05-09T21:39:13.197 回答
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])
于 2012-05-09T22:09:04.633 回答
0

使用has_table?

一个糟糕的解决方案:

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

这读起来很清楚,但是:

  • 它很脆。如果表结构或文本发生变化,它就会失败。
  • 如果失败,它只是说它期望 false 为真;我不知道有一种简单的方法可以将表格的真实外观与预期的外观进行比较,除了print page.html
  • has_table?方法可能会在某个时候被删除
于 2012-05-09T21:44:46.533 回答