example - rspec rails
¿Cómo afirmar el número de elementos usando Capybara con el mensaje de error correcto? (6)
Sé que en Capibara, puedes hacer algo como esto:
page.should have_css("ol li", :count => 2)
Sin embargo, suponiendo que esa página tenga, por ejemplo, solo un elemento coincidente, el error no es muy descriptivo:
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
En lugar de este mensaje de error bastante oscuro, ¿hay alguna forma de escribir la afirmación de tal manera que la salida de error sea algo así como ''Cuando coincida'' ol li '', esperado: 2, encontrado: 1''. Obviamente, yo podría hacer una lógica personalizada para ese tipo de comportamiento. Estoy preguntando si hay alguna manera de hacerlo "fuera de la caja".
Por lo que vale, estoy usando Selenium driver y RSpec.
¿Qué tal esto?
within(''ol'') do
expect( all(''.opportunity_title_wrap'').count ).to eq(2)
end
Bueno, como parece que no hay soporte listo para usar, escribí este marcador 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
Ahora, puedes hacer cosas como estas:
describe "initial page load", :type => :request do
it "has 12 inputs" do
visit "/"
page.should match_exactly(12, "input")
end
end
y obtener 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
El truco por el momento, voy a buscar hacer esta parte de Capibara.
Creo que lo siguiente es más simple, da un resultado bastante claro y elimina la necesidad de un marcador personalizado.
page.all("ol li").count.should eql(2)
Esto luego se imprime por error:
expected: 2
got: 3
(compared using eql?)
(RSpec::Expectations::ExpectationNotMetError)
La mejor práctica actual (9/2/2013) recomendada por Capybara es la siguiente ( fuente ):
page.assert_selector(''p#foo'', :count => 4)
La respuesta de @pandaPower es muy buena, pero la sintaxis fue ligeramente diferente para mí:
expect(page).to have_selector(''.views-row'', :count => 30)
Me gusta mucho mejor
expect(page).to have_selector(''input'', count: 12)