ruby-on-rails-3 - rspec rails 5
¿Es posible probar el orden de los elementos a través de RSpec/Capybara? (10)
El carpincho debería ser compatible con el selector +
(creo que usa Nokogiri, que ciertamente lo admite). ¿Tal vez estás usando una versión anterior? ¿O está usando un controlador de Capybara que no admite JavaScript, por lo que el elemento adicional no se está procesando?
Además, no use RSpec para probar su HTML. El pepino es mucho mejor en esto. Para interactuar con JavaScript, querrá usar Selenium o Capybara-Webkit. O si tiene mucho JavaScript, considere probarlo con Jasmine.
Estoy usando RSpec / Capybara como mi suite de pruebas. Tengo un javascript que agrega dinámicamente <li>
al final de un <ul>
. Quiero escribir una especificación de solicitud para garantizar que esto esté sucediendo.
Intenté usar el método has_css
Capybara y los selectores avanzados de CSS para probar el orden de los elementos <li>
, pero Capybara no admite el selector +
CSS.
Ejemplo:
page.should have_css(''li:contains("ITEM #1")'')
pseuo_add_new_li
page.should have_css(''li:contains("ITEM #1")+li:contains("ITEM #2")'')
¿Alguien sabe de otra manera de probar para ordenar?
En las soluciones anteriores, era muy difícil verificar el orden si tenía varios elementos en la página. Entonces, he encontrado otra manera.
He publicado la solución aquí - Prueba de orden (secuencia) de contenido usando capibara
Mapeo de las matrices que tienen elementos específicos CSS y luego unir esa matriz con la matriz esperada (mantener los elementos en secuencia)
Encontré una manera más canónica de probar este comportamiento con CSS. Puede usar los selectores :first-child
:last-child
y :nth-child(n)
en el que afirme que le gusta.
En su ejemplo probaría estas afirmaciones:
page.should have_tag("ul:last-child", :text => "ITEM #1")
pseuo_add_new_li
page.should have_tag("ul:nth-last-child(2)", :text => "ITEM #1")
page.should have_tag("ul:last-child", :text => "ITEM #2")
Espero que esto ayude a alguien. Lea más sobre esto .
Esta página tiene una forma muy inteligente de probar el orden de los elementos de cadena en una página, ya sea en una lista o no:
https://makandracards.com/makandra/789-match-strings-in-a-given-order-with-cucumber-and-capybara
Es en forma de un paso de pepino, pero debería poder extraer lo que necesita para un paso de Rspec. Es similar a la solución de Johns ''kludgy'', pero un poco más elegante por lo que puedo entender. Todos sus otros astutos pasos de prueba de capibara se pueden encontrar aquí:
Puede usar el método all finder para seleccionar múltiples elementos y luego usar collect para extraer el texto en una matriz:
assert_equal page.all(''#navigation ul li'').collect(&:text), [''Item 1'', ''Item 2'', ''Item 3'']
Si su lista no está visible en la página, como un menú de navegación emergente, debe pasar visible: false
al método all
.
Recientemente tuve el mismo problema y encontré esta solución limpia e ideal: http://launchware.com/articles/acceptance-testing-asserting-sort-order
Incluso está empaquetado como una pequeña joya.
Resolví este problema probando una coincidencia de expresiones regulares con el contenido del cuerpo de la página. Un poco kludgy, pero funciona.
page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
Usando capybara-ui puedes usar el método #widgets
para obtener todos los elementos en orden descendente.
# First define the widget,
# or reusable dom element reference.
# In this case in a role
class UserRole < Capybara::UI::Role
widget :list_item, ''.list-item''
end
# Then test the expected order using #widgets
role = UserRole.new
expected_order = [''buy milk'', ''get gas'', ''call dad'']
actual_order = role.widgets(:list_item).map(&:text)
expect(actual_order).to eq(expected_order)
este artículo enumera varias formas de probar el orden en RSpec, la mejor de las cuales parece ser esta coincidencia:
RSpec::Matchers.define :appear_before do |later_content|
match do |earlier_content|
page.body.index(earlier_content) < page.body.index(later_content)
end
end