rails example context rspec dsl capybara

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)