やりたいこと
結合テストにおいて、削除のリンクを踏んだあとに出現するconfirmダイアログのOKボタンをクリックしたい!
<%= link_to "削除", post_path(post.id), method: :delete, data: { confirm: '本当に削除しますか?' } //投稿の削除ボタン%>
実装方法
page.accept_confirm do
//削除ボタンをクリックする記述
end
↓記述例↓
page.accept_confirm do
all(".more")[0].hover.click_link('削除', href: post_path(@post1.id))
end
.moreを持つ要素を全て取得し、0番目の要素にhoverを当てています。
そうすることで削除ボタンが表示され、 .click_link で削除ボタンのリンクを踏んでいます。
expect{ } との合わせ技
実際の結合テストでは、モデルのカウントが1下がることを確認する必要があると思います。
下記のように記述することで上手くいきました。
expect{
page.accept_confirm do
all(".more")[0].hover.click_link('削除', href: post_path(@post1.id))
end
expect(page).to have_content('投稿を削除しました!') //この記述がポイント!!
}.to change { Post.count }.by(-1)
「この記述がポイント」の行の有無で、カウントが1下がるの検証結果が変わることがあります。
理由は、削除の処理が完了する前にテストが先に進んでしまうことがあるからです。
そのため、sleepやhave_〇〇を使い、処理が完了するまで時間を数秒だけ稼ぐ必要があります。
こちらの記事を参考にさせていただきました。
使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」
以上です!
テストコードに予想以上に詰まってしまったため、記事にさせていただきました。