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ばかり見ていましたが、一度立ち止まって全体を見ることの重要性を再認識できました。
参考になれば嬉しいです!