ruby on rails - restful - Cómo obtener la ruta actual con la cadena de consulta usando Capybara
routes in ruby on rails (5)
La URL de la página es algo así como /people?search=name
mientras usaba el método current_path
de capybara devuelto /people
only.
current_path.should == people_path(:search => ''name'')
Pero falla diciendo
expected: "/people?search=name"
got: "/people"
¿Cómo podemos hacer que pase? ¿Hay alguna forma de hacer esto?
EDITAR: como mencionó Tinynumberes, esto falla para las URL con número de puerto. Manteniéndolo aquí en caso de que alguien más tenga la misma brillante idea.
current_url[current_host.size..-1]
golfs exactamente igual (35 caracteres) como URI.parse(current_url).request_uri
, pero es potencialmente más rápido porque no hay un análisis URI explícito involucrado.
Hice una solicitud de extracción para agregar esto a Capybara en: https://github.com/jnicklas/capybara/pull/1405
He actualizado esta respuesta para reflejar las convenciones modernas en capibara. Creo que esto es ideal, ya que esta es la respuesta aceptada, y lo que muchas personas están siendo recomendadas cuando buscan una solución. Dicho esto, la forma correcta de verificar la ruta actual es usar has_current_path?
matcher proporcionado por Capybara, como se documenta aquí: Haga clic aquí
Ejemplo de uso:
expect(page).to have_current_path(people_path(search: ''name''))
Como puede ver en la documentación, hay otras opciones disponibles. Si la página actual es /people?search=name
pero solo le importa que esté en la página /people
independientemente del parámetro, puede enviar la opción only_path
:
expect(page).to have_current_path(people_path, only_path: true)
Además, si desea comparar la URL completa:
expect(page).to have_current_path(people_url, url: true)
Gracias a Tom Walpole por señalar este método.
Reemplacé el método _path con _url para lograr comparar las URL completas con los parámetros.
current_url.should == people_url(:search => ''name'')
Sé que se ha seleccionado una respuesta, pero solo quería dar una solución alternativa. Asi que:
Para obtener la ruta y la cadena de consulta, como request.fullpath
en Rails, puede hacer:
URI.parse(current_url).request_uri.should == people_path(:search => ''name'')
También puede hacer un método auxiliar en su clase de prueba (como ActionDispatch::IntegrationTest
) de esta manera (que es lo que hice):
def current_fullpath
URI.parse(current_url).request_uri
end
Espero que esto ayude.
Simplemente actualizando esta pregunta para los tiempos modernos. La mejor práctica actual para verificar current_paths cuando se usa Capybara 2.5+ es usar el matizador current_path, que usará el comportamiento de espera de Capybaras para verificar la ruta. Si quieres verificar contra request_uri (ruta y cadena de consulta)
expect(page).to have_current_path(people_path(:search => ''name''))
Si solo quieres la parte de la ruta (ignorando la cadena de consulta)
expect(page).to have_current_path(people_path, only_path: true)
Si quiere coincidir con la URL completa
expect(page).to have_current_path(people_url, url: true)
el emparejador tomará una cuerda que se compara con == o una expresión regular para hacer coincidir
expect(page).to have_current_path(/search=name/)