Ответ 1
Мне это нравится намного лучше.
expect(page).to have_selector('input', count: 12)
Я знаю, что в 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, found: 1". Очевидно, я мог бы создать собственную логику для такого поведения - я спрашиваю, есть ли способ сделать это "из коробки"?
Для чего это стоит, я использую драйвер Selenium и RSpec.
Мне это нравится намного лучше.
expect(page).to have_selector('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
Теперь это трюк, я рассмотрю эту часть Капибары.
Я думаю, что следующее проще, дает довольно четкий вывод и устраняет необходимость в специальном совпадении.
page.all("ol li").count.should eql(2)
Затем выдается сообщение об ошибке:
expected: 2
got: 3
(compared using eql?)
(RSpec::Expectations::ExpectationNotMetError)
Как насчет этого?
within('ol') do
expect( all('.opportunity_title_wrap').count ).to eq(2)
end
Текущая (9/2/2013) рекомендация, рекомендованная Capybara, следующая (источник):
page.assert_selector('p#foo', :count => 4)
Ответ от @pandaPower очень хороший, но синтаксис для меня несколько отличался:
expect(page).to have_selector('.views-row', :count => 30)