ruby on rails - test - ¿Cómo usar assert_select para probar la presencia de un enlace dado?
rails test (6)
Aquí es cómo puede afirmar una serie de cosas sobre un enlace usando assert_select
. El segundo argumento puede ser un String o un Regexp para probar el atributo href contra:
# URL string (2nd arg) is compared to the href attribute thanks to the ''?'' in
# CSS selector string. Also asserts that there is only one link matching
# the arguments (:count option) and that the link has the text
# ''Your Dashboard'' (:text option)
assert_select ''.menu a[href=?]'', ''http://test.host/dashboard'',
{ :count => 1, :text => ''Your Dashboard'' }
# Regular expression (2nd arg) tests the href attribute thanks to the ''?'' in
# the CSS selector string.
assert_select ''.menu a[href=?]'', //Ahttp:////test.host//dashboard/z/,
{ :count => 1, :text => ''Your Dashboard'' }
Para otras formas de usar assert_select
, aquí están los ejemplos tomados de los documentos de Rails actionpack 3.2.15 (ver archivo actionpack-3.2.15/lib/action_dispatch/testing/assertions/selector.rb
):
# At least one form element
assert_select "form"
# Form element includes four input fields
assert_select "form input", 4
# Page title is "Welcome"
assert_select "title", "Welcome"
# Page title is "Welcome" and there is only one title element
assert_select "title", {:count => 1, :text => "Welcome"},
"Wrong title or more than one title element"
# Page contains no forms
assert_select "form", false, "This page must contain no forms"
# Test the content and style
assert_select "body div.header ul.menu"
# Use substitution values
assert_select "ol>li#?", /item-/d+/
# All input fields in the form have a name
assert_select "form input" do
assert_select "[name=?]", /.+/ # Not empty
end
Mi página debe contener un enlace que parece <a href="/desired_path/1">Click to go</a>
.
¿Cómo probarías eso usando assert_select? Quiero verificar la presencia de a
etiqueta con href="/desired_path/1"
. ¿Cómo se prueban los atributos de una etiqueta?
¿Hay recursos para explicar cómo usar assert_select? Leí las guías y la documentación de la API, pero no lo resolví. ¿Hay alguna forma mejor recomendada de hacer esto?
Estoy trabajando en Rails 3 y utilizando el marco de prueba incorporado.
Gracias.
En assert_select, también puede usar un signo de interrogación para el valor del atributo, y luego seguir con una cadena para que coincida.
assert_select "a[href=?]", "/desired_path/1"
Hay otra forma de usar assert_select que es más amigable, especialmente si quieres hacer coincidir una cadena parcial o un patrón de expresión regular:
assert_select "a", :href => /acebook/.com//share/
La pregunta específicamente pregunta: "¿Cómo se prueban los atributos de [un elemento]?"
Las otras respuestas aquí usan assert_select
en formas que ya no funcionan en Rails / MiniTest actual. Según este issue , las afirmaciones sobre el contenido de los atributos ahora usan esta sintaxis de "coincidencia" de Xpath-y:
assert_select "a:match(''href'', ?)", /jm3/.net/
Para cualquier persona que utilice assert_select procedente de Rails 4.1 y actualice a Rails 4.2.
En 4.1 esto funcionó:
my_url = "/my_results?search=hello"
my_text = "(My Results)"
assert_select ''a[href=?]'', my_url, my_text
En 4.2 esto dio un error: "ADVERTENCIA DE DEPRECATION: La aserción no se ejecutó debido a un selector css no válido. Inesperado ''('' después de ''[: igual," / "/ my_results /" "]''"
Cambié la sintaxis a esto y funcionó !:
assert_select ''a[href=?]'', my_url, { text: my_text }
La respuesta de los Eliots arriba me ayudó, gracias :)
Puede pasar cualquier selector de CSS a assert_select. Entonces, para probar el atributo de una etiqueta, usas [attrname=attrvalue]
:
assert_select("a[href=/desired_path/1]") do |elements|
# Here you can test that elements.count == 1 for instance, or anything else
end
assert_select ''a'' do |link|
expect(link.attr(''href'').to_s).to eq expected_url
end