Я знаю, что в Capybara можно сделать что-то вроде этого:
page.should have_css("ol li", :count => 2)
Однако если предположить, что на странице есть, например, только один соответствующий элемент, ошибка не очень информативна:
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
Вместо этого довольно непонятного сообщения об ошибке, есть ли способ написать утверждение таким образом, чтобы вывод ошибки был чем-то вроде «При сопоставлении« ol li », ожидалось: 2, найдено: 1». Очевидно, я мог бы сам создать собственную логику для такого поведения - я спрашиваю, есть ли способ сделать это «из коробки»?
Как бы то ни было, я использую драйвер Selenium и RSpec.
page.should have_css("ol li", :count => 2)
еще не было реализовано.Ответы:
Мне это нравится намного больше.
expect(page).to have_selector('input', count: 12)
https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb
источник
have_css
:expect(page).to have_css('input', count: 12)
Ну, так как кажется, что нет поддержки из коробки, я написал этот пользовательский сопоставитель:
RSpec::Matchers.define :match_exactly do |expected_match_count, selector| match do |context| matching = context.all(selector) @matched = matching.size @matched == expected_match_count end failure_message_for_should do "expected '#{selector}' to match exactly #{expected_match_count} elements, but matched #{@matched}" end failure_message_for_should_not do "expected '#{selector}' to NOT match exactly #{expected_match_count} elements, but it did" end end
Теперь вы можете делать что-то вроде:
describe "initial page load", :type => :request do it "has 12 inputs" do visit "/" page.should match_exactly(12, "input") end end
и получите такой результат:
1) initial page load has 12 inputs Failure/Error: page.should match_exactly(12, "input") expected 'input' to match exactly 12 elements, but matched 13
На данный момент это помогает, я постараюсь сделать эту часть Capybara.
источник
Я думаю, что следующее проще, дает довольно четкий вывод и устраняет необходимость в настраиваемом сопоставлении.
page.all("ol li").count.should eql(2)
Затем при ошибке выводится:
expected: 2 got: 3 (compared using eql?) (RSpec::Expectations::ExpectationNotMetError)
источник
Изменить: как указано @ThomasWalpole, использование
all
отключает ожидание / повторные попытки Capybara, поэтому ответ @pandaPower выше намного лучше.Как насчет этого?
within('ol') do expect( all('.opportunity_title_wrap').count ).to eq(2) end
источник
within
, он вызывает.count
результаты,all
которые отключают ожидание / повторные попытки. Вызываяcount
результатыall
(для которых допустимым возвратом является пустой «массив») вы конвертируете их в целое число и сравниваете его. Если это сравнение не оправдывает себя, ожидания не оправдаются. Если вместо этого вы передадите опцию подсчета одному из сопоставителей Capybara, капибара будет ждать / повторять попытки поиска указанного селектора до тех пор, пока опция подсчета не совпадет (или истечет срок действия Capybara.default_max_wait_time).Текущая (2 сентября 2013 г.) передовая практика, рекомендованная Capybara, заключается в следующем ( источник ):
page.assert_selector('p#foo', :count => 4)
источник
Ответ @pandaPower очень хорош, но синтаксис у меня немного отличался:
expect(page).to have_selector('.views-row', :count => 30)
источник