3

Rails 4 機能仕様では、RSpec 3 と Capybara を使用して、ページに特定のタグが一定数存在するかどうかをどのようにアサートしますか?

私は試した:

expect(find('section.documents .document').count).to eq(2)

しかし、次のように言ってもうまくいきません。

Ambiguous match, found 2 elements matching css "section.documents .document"

また、機能仕様で、ビューで使用されるタグやクラスの種類などの特定のものをテストすることは良い考え/悪い習慣ですか?

4

1 に答える 1

6

使用の問題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

expect(page).to have_selector('section.documents .document', count: 2)
于 2014-08-27T15:08:23.737 に答える