J'ai le test suivant dans une spécification de demande:
page.should have_link('Edit user', :href => edit_users_path(@user))
Cela vérifie qu'un utilisateur spécifique dans une vue d'index dispose d'un lien d'édition. Je voudrais cliquer sur le même lien, avec quelque chose comme:
click_link('Edit user', :href => edit_users_path(@user))
Malheureusement, click_link n'accepte pas les options.
Existe-t-il un bon moyen de le faire, cela semble être un cas d'utilisation assez évident?
Dois-je inclure un #id dans le tableau <tr>
ou <td>
et faire quelque chose comme:
within(#user_id)
click_link 'Edit user'
end
Je préfère ne pas bricoler avec la vue juste pour que les tests fonctionnent.
vous pouvez utiliser find find(:xpath, "//a[@href='/foo']").click
Pour ce faire, vous pouvez utiliser l'interface de niveau inférieur de Capybara. Essayer:
find("a[href='#{edit_users_path}']").click
J'ai fini par ajouter un module d'assistance dans spec/support/selectors.rb
module Selectors
Capybara.add_selector(:linkhref) do
xpath {|href| ".//a[@href='#{href}']"}
end
end
Puis dans les tests que j'utilise
find(:linkhref, some_path).click
Sur la base de la réponse @jackpipe (et de mon expérience précédente), je construis mon propre sélecteur Capybara, voici le code du module d'assistance (spec/support/selectors.rb
):
module Selectors
# find(:href, 'google.com')
Capybara.add_selector(:href) do
xpath {|href| XPath.descendant[XPath.attr(:href).contains(href)] }
end
end
Exemple d'utilisation:
find(:href, 'google')
Quelle est la différence?
Eh bien, cela trouvera tout lien contenant "google". Les éléments suivants correspondront:
www.google.com
http://google.com
fonts.google.com
something.google.inside.com
De plus, il ne recherchera que parmi les sélecteurs descendants, par exemple within('header') { find(:href, 'google').click }
fonctionnera correctement.
Laisser le premier argument vide semble fonctionner pour moi ...
page.should have_link("", :href=>edit_comment_path(@comment))