質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1802閲覧

管理ユーザーで投稿を削除する挙動をRSpecでテストしたい

AkiDatsugoku26

総合スコア35

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/12/10 11:06

前提・実現したいこと

deviseを使用して管理ユーザーのログイン機能を実装済みです。
userモデルにadminの属性を付与するのではなく、
adminモデルは別で作成しました。

発生している問題・エラーメッセージ

1) Adminers log in as a adminer Failure/Error: click_link '削除' Capybara::ElementNotFound: Unable to find link "削除"

下記が管理画面へのログイン画面です。
イメージ説明

ログインすると各投稿のタイトルと詳細ページへのリンク、削除リンクが表示されます。
イメージ説明

※タイトルが同じですが別々の記事です。

該当のソースコード

RSpec

1require 'rails_helper' 2require 'capybara/rspec' 3 4RSpec.describe "Adminers", type: :feature do 5 scenario "log in as a adminer" do 6 adminer = FactoryBot.create(:adminer) 7 visit root_path 8 click_link "管理者" 9 fill_in "Email", with: adminer.email 10 fill_in "Password", with: adminer.password 11 click_button "Log in" 12 13 expect(page).to have_content "ログインしました。" 14 15 click_link '削除' 16 page.driver.browser.switch_to.alert.accept 17 expect(page).to have_content "Article was successfully destroyed." 18 end 19end
**一覧画面(管理者専用)のコード** <h1>Adminers Articles</h1> <tbody> <% @adminers_articles.each do |adminers_article| %> <tr> <!--<td><%= image_tag adminers_article.image %></td>--> <td><%= link_to adminers_article.title %></td> <td><%= link_to '詳細', [:adminers, adminers_article] %></td> <td><%= link_to '削除', [:adminers, adminers_article], method: :delete, data: { confirm: 'Are you sure?' } %></td> <!--作者の名前を表示させる--> </tr> <% end %> </tbody>

試したこと

そもそもログインできていないのかもと考えてclick_link '削除'以下をコメント
アウトしてみて再度テストを実行してみました。

結果はパスしたのでやはりcapybaraが'削除'リンクを見つけられていないようなのですが、
原因が分からず困っています。

補足情報(FW/ツールのバージョンなど)

管理ユーザー機能は下記のページを参考に実装しました。
https://ccbaxy.xyz/blog/2020/03/20/ruby33/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

こちら自己解決できましたので共有します!

下記修正したRSpecのコードです。

require 'rails_helper' require 'capybara/rspec' RSpec.describe "Adminers", type: :feature do scenario "log in as a adminer", js: true do FactoryBot.create(:article) visit root_path click_link "管理者" fill_in "Email", with: "admin@admin" fill_in "Password", with: "testtest" click_button "Log in" expect(page).to have_content "ログインしました。" click_link '削除' page.accept_confirm expect(page).to have_content 'Article was successfully destroyed.' end end

変更点としては、、
① FactoryBotでarticleデータを挿入した。
→記事がなければ「削除」リンクもできないので冷静に考えると当然ですね、、

② 管理者ユーザーをseeds.rbに登録しそのユーザーをテストでも使用した。

③ 記事が削除できたかの確認を削除時のメッセージで確認
→僕の場合は'Article was successfully destroyed.'です。

以上です!

投稿2021/12/10 14:01

AkiDatsugoku26

総合スコア35

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AkiDatsugoku26

2021/12/10 14:35

補足です。 投稿を削除する際のダイアログ(削除しますか?の確認アラートのこと)をRSspecで再現する場合そのままでは動きません。 その為js: true do をつける必要があります。 またダイアログでOKをクリックする際はpage.accept_confirmとし削除を許可しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問