ror restful rails generate ruby-on-rails ruby-on-rails-3 rspec capybara

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/)