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

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

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

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

スポンサーリンク

テストコード 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 もおすすめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!