tkymtk's blog

Ruby on Rails及びその周辺について調べたこと。Do whatever you want to do at your own pace.

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では後者)

どちらでも大丈夫です。

関連

間違いがあれば、ご指摘下さると幸いです。