Ответ 1
Я решил эту проблему, проверив соответствие регулярного выражения для содержимого тела на странице. Немного клочья, но он работает.
page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
Я использую RSpec/Capybara как свой тестовый набор. У меня есть javascript, который динамически добавляет <li>
в конец <ul>
. Я хочу написать спецификацию запроса, чтобы убедиться, что это происходит.
Я попытался использовать метод has_css
Capybara и расширенные CSS-селектора, чтобы проверить порядок элементов <li>
, но Capybara не поддерживает селектор CSS +
.
Пример:
page.should have_css('li:contains("ITEM #1")')
pseuo_add_new_li
page.should have_css('li:contains("ITEM #1")+li:contains("ITEM #2")')
Кто-нибудь знает о другом способе тестирования для заказа?
Я решил эту проблему, проверив соответствие регулярного выражения для содержимого тела на странице. Немного клочья, но он работает.
page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
Я нашел более канонический способ тестирования этого поведения с помощью CSS. Вы можете использовать пользовательские :first-child
, :last-child
и :nth-child(n)
селектора в зависимости от того, что вам нравится.
В вашем примере я бы попробовал эти утверждения:
page.should have_tag("ul:last-child", :text => "ITEM #1")
pseuo_add_new_li
page.should have_tag("ul:nth-last-child(2)", :text => "ITEM #1")
page.should have_tag("ul:last-child", :text => "ITEM #2")
Надеюсь, это поможет кому-то. Подробнее об этом.
в этой статье перечислены несколько способов проверки порядка сортировки в RSpec, лучшим из которых, кажется, является этот сокет:
RSpec::Matchers.define :appear_before do |later_content|
match do |earlier_content|
page.body.index(earlier_content) < page.body.index(later_content)
end
end
Эта страница имеет очень умный способ проверки порядка строковых элементов на странице - будь то в списке или нет:
https://makandracards.com/makandra/789-match-strings-in-a-given-order-with-cucumber-and-capybara
Он находится в форме шага огурца, но вы должны иметь возможность извлекать то, что вам нужно для шага Rspec. Это похоже на решение Kludgy'а от Johns, но немного больше, чем я могу разобраться. Все их другие хитроумные шаги тестирования capybara можно найти здесь:
Недавно у меня была такая же проблема, и я нашел это опрятное и идеальное решение: http://launchware.com/articles/acceptance-testing-asserting-sort-order
Он даже упакован как крошечный камень.
Используйте orderly
драгоценный камень, написанный автором article, упомянутых ранее.
Это просто:
expect(this).to appear_before(that)
Вы можете использовать метод поиска all для выбора нескольких элементов, а затем использовать коллекцию, чтобы вытащить текст в массив:
assert_equal page.all('#navigation ul li').collect(&:text), ['Item 1', 'Item 2', 'Item 3']
Если ваш список не отображается на странице, например всплывающее меню навигации, вам необходимо передать visible: false
в метод all
.
Capybara должен поддерживать селектор +
(я считаю, что он использует Nokogiri, что, безусловно, поддерживает это). Возможно, вы используете старую версию? Или вы используете драйвер Capybara, который не поддерживает JavaScript, так что дополнительный элемент вообще не отображается?
Кроме того, не используйте RSpec для тестирования вашего HTML. Огурец намного лучше. Для взаимодействия с JavaScript вы захотите использовать Selenium или Capybara-Webkit. Или, если у вас много JavaScript, попробуйте проверить его с помощью Jasmine.
Используя capybara-ui, вы можете использовать метод #widgets
, чтобы получить все элементы в порядке сверху вниз.
# First define the widget,
# or reusable dom element reference.
# In this case in a role
class UserRole < Capybara::UI::Role
widget :list_item, '.list-item'
end
# Then test the expected order using #widgets
role = UserRole.new
expected_order = ['buy milk', 'get gas', 'call dad']
actual_order = role.widgets(:list_item).map(&:text)
expect(actual_order).to eq(expected_order)