リクエスト仕様に次のテストがあります:
page.should have_link('Edit user', :href => edit_users_path(@user))
これにより、インデックスビュー内の特定のユーザーに編集リンクがあることを確認します。次のようなもので、同じリンクをクリックしたいと思います。
click_link('Edit user', :href => edit_users_path(@user))
残念ながら、click_linkはオプションを受け入れません。
これを行う良い方法はありますか、それはかなり明白なユースケースのように思えますか?
テーブルに#idを含める必要があります<tr>
または<td>
および次のようなことを行います。
within(#user_id)
click_link 'Edit user'
end
テストを機能させるためだけに、ビューをいじくり回したくないのです。
find find(:xpath, "//a[@href='/foo']").click
を使用できます
これを行うには、Capybaraの低レベルインターフェイスを使用できます。試してください:
find("a[href='#{edit_users_path}']").click
spec/support/selectors.rb
にヘルパーモジュールを追加しました
module Selectors
Capybara.add_selector(:linkhref) do
xpath {|href| ".//a[@href='#{href}']"}
end
end
その後、私が使用するテストで
find(:linkhref, some_path).click
@jackpipeの回答(および以前の経験)に基づいて、独自のCapybaraセレクターを作成します。ヘルパーモジュールのコードは次のとおりです(_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
_
使用例:
_find(:href, 'google')
_
違いは何ですか?
さて、これは「google」を含むリンクを見つけます。以下が一致します。
_www.google.com
http://google.com
fonts.google.com
something.google.inside.com
_
さらに、子孫セレクター間でのみ検索します。 within('header') { find(:href, 'google').click }
は正しく動作します。
最初の引数を空白のままにしておくとうまくいくようです...
page.should have_link("", :href=>edit_comment_path(@comment))