【rspec】fill_inがあっているのにfetureテストが失敗する原因 ログインで失敗してない?


rspecのfeatureテストが通らない

capybaraでわかりやすくて便利なのですが、fill_inハマったので解決策の1つを紹介します。

expect内のfiii_inのところでどうしてもエラーが起きてしまう。

検証して生成されたhtmlから見つけたidを指定しても、新たにidを作っても、findを使ってもできませんでした
。。

しかし数時間の格闘の末結論が出ました。

この記事のゴール

fill_inのエラー解決策の1つとして検証してみてください!

結論 ログインに失敗している

自分の場合は結論ログインがうまくできていないためエラーが起きていました。

失敗したコード

topics_spec.rb
scenario "user creates a new topic" do
    user = FactoryBot.create(:user)
    visit root_path
    click_link "ログイン"
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
ココ→ click_link "ログイン"

    expect {
      visit new_topic_path
      fill_in "topic_description", with: "test"
      click_button "投稿"

      expect(page).to have_content "投稿しました"
      expect(page).to have_content "test"
      expect(page).to have_content "#{user.name}"
    }.to change(user.topics, :count).by(1)

click_linkでログインを指定ためsubmitではなくヘッダーのリンクをクリックしていました。
そのためログインページでメールアドレスとパスワードを入力して、もう一度ログインページをクリックしていました。。
なんと不毛なことを。。。。

ということでclick_linkではなく、click_buttonを指定。

topics_spec.rb
scenario "user creates a new topic" do
    user = FactoryBot.create(:user)
    visit root_path
    click_link "ログイン"
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
ココ→ click_button "ログイン"

    expect {
      visit new_topic_path
      fill_in "topic_description", with: "test"
      click_button "投稿"

      expect(page).to have_content "投稿しました"
      expect(page).to have_content "test"
      expect(page).to have_content "#{user.name}"
    }.to change(user.topics, :count).by(1)

これでちゃんと通りました。

まとめ

fill_inでエラーが起きているのでfill_inばかり見ていましたが、一度立ち止まって全体を見ることの重要性を再認識できました。

参考になれば嬉しいです!