Как утверждать количество элементов с помощью капибары с правильным сообщением об ошибке?
Я знаю, что в капибара, вы можете сделать что-то вроде этого:
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 driver и RSpec.
6 ответов:
Ну, как кажется, нет поддержки из коробки, я написал этот пользовательский сопоставитель:
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)
текущая (9/2/2013) лучшая практика, рекомендованная Capybara, заключается в следующем (источник):
page.assert_selector('p#foo', :count => 4)