Eu sei que na Capivara você pode fazer algo assim:
page.should have_css("ol li", :count => 2)
No entanto, supondo que a página tenha, por exemplo, apenas um elemento correspondente, o erro não é muito descritivo:
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
Em vez dessa mensagem de erro um tanto obscura, há uma maneira de escrever a declaração de forma que a saída de erro seja algo como 'Ao combinar' ol li ', esperado: 2, encontrado: 1'. Obviamente, eu poderia fazer uma lógica personalizada para esse tipo de comportamento - estou perguntando se há uma maneira de fazer isso 'fora da caixa'?
Pelo que vale a pena, estou usando o driver Selenium e RSpec.
page.should have_css("ol li", :count => 2)
já não tivesse sido implementado.Respostas:
Eu gosto muito mais disso.
expect(page).to have_selector('input', count: 12)
https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb
fonte
have_css
:expect(page).to have_css('input', count: 12)
Bem, como parece que não há suporte pronto para uso, escrevi este matcher personalizado:
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
Agora, você pode fazer coisas como:
describe "initial page load", :type => :request do it "has 12 inputs" do visit "/" page.should match_exactly(12, "input") end end
e obter resultados como:
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
Por enquanto, funciona. Vou tentar fazer essa parte da Capivara.
fonte
Acho que o seguinte é mais simples, fornece uma saída bastante clara e elimina a necessidade de um combinador personalizado.
page.all("ol li").count.should eql(2)
Em seguida, isso imprime em erro:
expected: 2 got: 3 (compared using eql?) (RSpec::Expectations::ExpectationNotMetError)
fonte
Edit: Como apontado por @ThomasWalpole, usar
all
desabilita a espera / nova tentativa do Capivara, então a resposta acima por @pandaPower é muito melhor.Que tal agora?
within('ol') do expect( all('.opportunity_title_wrap').count ).to eq(2) end
fonte
within
, ele está chamando.count
os resultadosall
disso desativa a espera / nova tentativa. Ao chamarcount
os resultados deall
(para o qual uma "matriz" vazia é um retorno válido), você converte para um inteiro e o compara. Se essa comparação falhar, a expectativa falha. Se, em vez disso, você passar a opção de contagem para um dos combinadores de Capivara, a capivara irá esperar / tentar encontrar o seletor especificado até que a opção de contagem corresponda (ou Capybara.default_max_wait_time expira).A melhor prática atual (02/09/2013) recomendada pela Capivara é a seguinte ( fonte ):
page.assert_selector('p#foo', :count => 4)
fonte
A resposta de @pandaPower é muito boa, mas a sintaxe foi um pouco diferente para mim:
expect(page).to have_selector('.views-row', :count => 30)
fonte