Rails + Devise + OmniAuth で Facebook/Twitter の OAuth 認証を RSpec + Capybara でインテグレーションテスト(RequestSpec)

スポンサーリンク

Rails4 アプリケーションで、Devise + OmniAuth により認証システムを構築し、Facebook/Twitter の OAuth 認証に対して、RSpec + Capybara でインテグレーションテスト(RequestSpec)を行います。OAuth 認証用のモックを使用します。

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

以下の公式Wikiを中心に進めました。

Integration Testing – omniauth

また、Devise と Omniauth を使っての認証の実装と仕様は以下。

Rails4 で Devise と OmniAuth で、Twitter/Facebook のOAuth認証と通常フォームでの認証を併用して実装 | EasyRamble
Rails4 で Devise と OmniAuth を使い、通常フォームでのユーザー登録・サインインと OAuth 認証を併用する仕様を考えた | EasyRamble

— 環境 —
rails-4.0.1
devise-3.2.2
omniauth-1.1.4
rspec-rails-2.14.0
capybara-2.2.0

公式Wikiを読んで、要点の和訳

OmniAuth.config.test_mode

OmniAuth へのリクエストがモックによる認証となり、/auth/provider へのリクエストが即座に、/auth/provider/callback へとリダイレクトされる。

OmniAuth.config.mock_auth

mock_auth にインテグレーションテストで使われる、モック用の認証ハッシュをセットします。:default のハッシュキーを使うと、プロバイダーが指定されない場合のデフォルトを指定できる。

OmniAuth.config.add_mock

add_mock メソッドを使うと、モックに新たな要素を追加でき、デフォルトの認証ハッシュとマージされます。

Mocking Failure

mock_auth にハッシュでなくシンボルを指定すると、次のメッセージとともに認証が失敗します。”You will be redirected back to /auth/failure?message=invalid_credentials”

Setting up the controller

ルーティングのエラーを回避するために、以下を設定します。

OmniAuth によるログイン用ヘルパーを定義

ここから、テスト準備用のコードを書きます。まずは、omniauth 認証用のヘルパー(set_omniauth, login_with_omniauth)を作成したりなど。set_omniauth が OAuth 認証テスト用の準備やモックをセットするメソッド。login_with_omniauth が OAuth 認証URLにアクセスして認証させるメソッドです。

app/spec/support/request_helpers.rb

spec/spec_helper.rb

続いて、spec_helper.rb にて作成した、RequestHelpers モジュールを include。

spec/spec_helper.rb

RequestSpec

続いて、インテグレーションテストを生成してテストコードを書く。

spec/requests/omniauth_pages_spec.rb

以上です。

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

Leave Your Message!