RSpec + Capybaraでセッション管理コントローラーに直接HTTPリクエストを発行してテスト

スポンサーリンク

Rails アプリのユーザー認証で使うセッションコントローラーにおける RSpec + Capybara でのテスト。

すでにサインインしているユーザーには、サインインページを再度表示しない、サインインのリクエストを直接発行させない、というロジックにしたい。

具体的には、サインイン済みのユーザーがサインインページ(サインイン用のフォーム)を表示させようとしたら、ルートパスへとリダイレクトさせる。HTTPによる直接のサインインのリクエストに対しても、ルートパスへとリダイレクトさせる。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

テストコード spec/requests/authentication_pages_spec.rb

テストのために以下のコードを書きました。get, post メソッドを使って、SessionsController のアクション(new, create)に対し HTTP リクエストを直接発行させます。フォームを使わないリクエストに対しても万全にするため。

spec/requests/authentication_pages_spec.rb

テスト実行。

テストを通らない赤色が2つ出ます、specify の行のところです。

実装 app/controllers/sessions_controller.rb

テストを通すために、SessionsController に no_signed_in_user メソッドを実装して before_action に登録しました。

app/controllers/sessions_controller.rb

セッションコントローラーの new, create アクションにはサインインしていないユーザーのみ、アクセスできるようにする。サインイン済みのユーザーは、redirect_to root_path でルートへとリダイレクトさせます。

これでテストを通って、狙い通りの挙動となりましたが、いまいち RSpec の書き方に自信が持てない(苦笑。テストの18行目、before { post sessions_path, email: user.email, password: user.password } の行のところが特に。これであってますかね。

Ruby on Rails Tutorial を参考にしつつウェブアプリケーションを製作中なのですが、なんとなく RSpec のテストの書き方に慣れて、テストを書くのが楽しくなってきました。

スポンサーリンク
私は Rails のテストフレームワークには RSpec を使っています。サーバーのテスト用に Serverspec もおすすめです。
 
スポンサーリンク

Leave Your Message!