Wiem, że w Kapibara można zrobić coś takiego:
page.should have_css("ol li", :count => 2)
Zakładając jednak, że strona ma na przykład tylko jeden pasujący element, błąd nie jest zbyt opisowy:
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
Czy zamiast tego raczej niejasnego komunikatu o błędzie, istnieje sposób na zapisanie asercji w taki sposób, że wynik błędu będzie podobny do „Podczas dopasowywania„ ol li ”, oczekiwano: 2, znaleziono: 1”. Oczywiście mógłbym sam stworzyć niestandardową logikę dla takiego zachowania - pytam, czy jest sposób na zrobienie tego „po wyjęciu z pudełka”?
Co jest warte, używam sterownika Selenium i RSpec.
page.should have_css("ol li", :count => 2)
który nie zostałby już zaimplementowany.Odpowiedzi:
To mi się podoba o wiele bardziej.
expect(page).to have_selector('input', count: 12)
https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb
źródło
have_css
:expect(page).to have_css('input', count: 12)
Cóż, wydaje się, że nie ma wsparcia po wyjęciu z pudełka, napisałem ten niestandardowy element dopasowujący:
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
Teraz możesz robić takie rzeczy jak:
describe "initial page load", :type => :request do it "has 12 inputs" do visit "/" page.should match_exactly(12, "input") end end
i uzyskaj wyniki takie jak:
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
Na razie to działa, przyjrzę się tworzeniu tej części Kapibary.
źródło
Myślę, że poniższe jest prostsze, daje dość wyraźne wyniki i eliminuje potrzebę dopasowywania niestandardowego.
page.all("ol li").count.should eql(2)
To następnie jest drukowane po błędzie:
expected: 2 got: 3 (compared using eql?) (RSpec::Expectations::ExpectationNotMetError)
źródło
Edycja: Jak wskazał @ThomasWalpole, użycie
all
wyłącza oczekiwanie / ponawianie próby Kapibary, więc powyższa odpowiedź @pandaPower jest znacznie lepsza.Co powiesz na to?
within('ol') do expect( all('.opportunity_title_wrap').count ).to eq(2) end
źródło
within
, wywołuje.count
wyniki,all
które wyłączają oczekiwanie / ponawianie. Wywołująccount
wynikiall
(dla których pusta "tablica" jest prawidłowym zwrotem) konwertujesz na liczbę całkowitą i porównujesz ją. Jeśli to porównanie zawodzi, oczekiwanie zawodzi. Jeśli zamiast tego przekażesz opcję count do jednego z dopasowań Kapibary, kapibara zaczeka / ponawia próbę znalezienia określonego selektora, aż opcja zliczania zostanie dopasowana (lub wygaśnie Capybara.default_max_wait_time).Obecna (02.09.2013) najlepsza praktyka zalecana przez Kapibarę jest następująca ( źródło ):
page.assert_selector('p#foo', :count => 4)
źródło
Odpowiedź @pandaPower jest bardzo dobra, ale składnia była dla mnie nieco inna:
expect(page).to have_selector('.views-row', :count => 30)
źródło