Oauthでの認証をRspecの統合テストで確認する方法
Railsでログイン管理にFacebookのOAuthでの認証を使っているのですが、それに対するテストを書くことがうまくできず躓いています。ネット上にいくつか情報はあったのですが古いものも錯綜しておりどれに従えば良いのかわかりませんでした。
出来る所までやったのを書かせてもらいますと
spec/support/omniauth.rb
def set_omniauth
OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(:facebook, {uid: '123545', name: 'foo bar'})
end
spec/requests/authentication_spec.rb
require 'rails_helper'
describe 'authentication' do
before do
set_omniauth
Rails.application.env_config["devise.mapping"] = Devise.mappings[:user]
Rails.application.env_config["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
visit '/users/auth/facebook?user_type=host'
end
it 'Facebookから承認OK' do
expect(page).to have_content 'Facebook から承認されました。'
end
end
としているのですが、テストには以下のエラーで失敗します。
expected #has_content?("Facebook から承認されました。") to return true, got false
spec/spec_helper.rb
でadd_mock
を使うサンプルなどもありましたが
公式のWikiと
https://github.com/intridea/omniauth/wiki/Integration-Testing
こちらのサイトを参考に行いました。
http://cookieshq.co.uk/posts/how-to-test-facebook-login-using-devise-omniauth-rspec-and-capybara/
どこを直せば正しくテストできるでしょうか?
追記
バージョン情報
rails (4.1.6)
rspec (3.3.0)
omniauth (1.2.2)
omniauth-facebook (2.0.0)
omniauth-oauth2 (1.2.0)
devise (3.4.1)
app/controllers/users/omniauth_callbacks_controller.rb
class Users::OmniauthCallbacksController <
Devise::OmniauthCallbacksController
def facebook
user_type = request.env["omniauth.params"]["user_type"]
auth_info = request.env["omniauth.auth"]
@user = User.find_for_facebook_oauth(auth_info, user_type)
# 略
end
end
app/models/user.rb
def self.find_for_facebook_oauth(auth, user_type)
# 略
User.new(provider: auth.provider, uid: auth.uid,
token: auth.credentials.token, authable_type: authable_type)
end