5

カピバラを使用して、リストに正しいアイテムが含まれていることをテストしようとしています。例えば:

<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>

このリストにはID1と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)')

これは冗長で醜いものであり、ID3をテーブルに含めるべきではないと実際には言っていません。

于 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がtrueであると予想されたとだけ表示されます。テーブルが実際にどのように見えるかを予想と比較する簡単な方法はわかりません。print page.html
  • has_table?メソッドはある時点で削除される可能性があります
于 2012-05-09T21:44:46.533 に答える