RSpec, Capybara: click_link でテストが失敗するときに、疑うこと。
リンクのパスや、リンクの名前が合っていることを前提とします。
結論
click_linkの直前に、適切なページを訪問しているか確認する。
例
例としてRuby on Rails チュートリアル:実例を使って Rails を学ぼうにあるテストを見てみます。
以下の3つのリンクは、ヘッダーやフッター部に入れられていて、 全ページに共通して存在するとします。
- Home
- About
- Help
次の名前のリンクは特定のページ(ここではHome)にしか存在しないとします。
- Sign up now!
このとき、以下のテストは失敗します。
it "should have the right links on the layout" do visit root_path click_link "About" expect(page).to have_title(full_title('About Us')) click_link "Help" expect(page).to have_title(full_title('Help')) click_link "Sign up now!" # 失敗! expect(page).to have_title(full_title('Sign up')) end
理由
click_linkは実際にそのページを訪問するので、 直前に訪れたページに"Sign up now!"というリンクが無ければ、 リンクが見つからないのでテストが失敗します。
対策
- 直前にそのリンクがあるページに移動する。
この場合、ルートページ(Home)のみに"Sign up now!"のリンクがあるので、
- 最初のvisit root_pathの直後にclick_link "Sign up now!" を挿入する
- または、click_link "Sign up now!" の位置は変えずに、その直前に visit root_path またはclick_link "Home"を挿入する。(Tutorialでは後者)
どちらでも大丈夫です。