2014-08-27 3 views
1

В спецификациях Rails 4, используя RSpec 3 и Capybara, как я могу утверждать, существует ли определенное количество определенных тегов на странице?Как проверить, сколько конкретных элементов HTML находится на странице с помощью RSpec?

Я пробовал:

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

Но это не работает, говоря:

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

Кроме того, это хорошая идея/плохая практика, чтобы проверить в спецификации функция что-то настолько специфичны, как тип тегов и классов, используемых в представлении?

ответ

3

Проблема с использованием find заключается в том, что он предназначен для возврата одного совпадающего элемента. Для того, чтобы найти все соответствующие элементы, которые затем могут быть подсчитаны, вам нужно использовать all:

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

Однако этот подход не используют методы ожидания/запрос водосвинки в. Это означает, что если элементы загружаются асинхронно, это утверждение может случайно выйти из строя. Например, 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)