L'URL de la page ressemble à quelque chose comme /people?search=name
si j'utilisais la current_path
méthode capybara, elle /people
ne retournait que.
current_path.should == people_path(:search => 'name')
Mais ça ne dit pas
expected: "/people?search=name"
got: "/people"
Comment pouvons-nous le faire passer? Y a-t-il un moyen de le faire?
"/people?search=name"
n'est pas un chemin ."/people"
est un cheminRéponses:
J'ai mis à jour cette réponse pour refléter les conventions modernes en capybara. Je pense que c'est idéal car c'est la réponse acceptée, et ce à quoi de nombreuses personnes sont référées lorsqu'elles recherchent une solution. Cela dit, la bonne façon de vérifier le chemin actuel est d'utiliser le
has_current_path?
matcher fourni par Capybara, comme documenté ici: Cliquez iciExemple d'utilisation:
Comme vous pouvez le voir dans la documentation, d'autres options sont disponibles. Si la page actuelle est
/people?search=name
mais que vous vous souciez seulement qu'elle soit sur la/people
page quel que soit le paramètre, vous pouvez envoyer l'only_path
option:De plus, si vous souhaitez comparer l'URL entière:
Nous remercions Tom Walpole d'avoir souligné cette méthode.
la source
current_path.should ==
fonctionne pour le moment (bien que je doive ajouter une barre oblique de fin en tant que chaîne). Je vous remercie d'avance pour le code dont j'aurai probablement besoin.URI.parse(current_url).request_uri
est plus succinct. Voir la réponse de @Lasse Bunk.ignore_query: true
place deonly_path: true
J'ai remplacé la méthode _path par _url pour comparer les URL complètes avec les paramètres.
la source
current_path
dans les nouvelles versions de Capybara et le faire correspondre contrepeople_path(...)
Je mets juste à jour cette question pour les temps modernes. La meilleure pratique actuelle pour vérifier current_paths lors de l'utilisation de Capybara 2.5+ est d'utiliser le matcher current_path, qui utilisera le comportement d'attente de Capybaras pour vérifier le chemin. Si vous souhaitez vérifier par rapport au request_uri (chemin et chaîne de requête)
Si vous voulez seulement la partie du chemin (en ignorant la chaîne de requête)
Si vous souhaitez faire correspondre l'URL complète
le matcher prendra une chaîne qui est comparée à == ou à une expression régulière à comparer
la source
should
syntaxe. Vous devriez vous efforcer d'utiliserexpect().to
dans vos spécifications à l'avenir.only_path: true
est maintenantignore_query: true
Je sais qu'une réponse a été choisie, mais je voulais juste donner une solution alternative. Alors:
Pour obtenir le chemin et la chaîne de requête, comme
request.fullpath
dans Rails, vous pouvez faire:Vous pouvez également faire une méthode d'assistance dans votre classe de test (comme
ActionDispatch::IntegrationTest
) comme celle-ci (ce que j'ai fait):J'espère que cela t'aides.
la source
EDIT: comme Tinynumberes l'a mentionné, cela échoue pour les URL avec numéro de port. Gardez-le ici au cas où quelqu'un d'autre aurait la même idée géniale.
golfs exactement aussi bien (35 caractères) que
URI.parse(current_url).request_uri
, mais est potentiellement plus rapide car aucune analyse d'URI explicite n'est impliquée.J'ai fait une demande de tirage pour ajouter ceci à Capybara à l' adresse : https://github.com/jnicklas/capybara/pull/1405
la source
current_url
peut contenir un numéro de port. Par exemple, étant donné uncurrent_url
dehttp://foo.com:8888/some/path
,current_url[current_host.size..-1]
sera égal:8888/some/path
. En outre, dans les coulissescurrent_host
fait le même type deURI.parse
logique que @nzifnab recommandé dans la réponse acceptée.