17135


Railsでログイン管理にFacebookのOAuthでの認証を使っているのですが、それに対するテストを書くことがうまくできず躓いています。ネット上にいくつか情報はあったのですが古いものも錯綜しておりどれに従えば良いのかわかりませんでした。

出来る所までやったのを書かせてもらいますと

### spec/support/omniauth.rb

[code]

    def set_omniauth
      OmniAuth.config.test_mode = true
      OmniAuth.config.add_mock(:facebook, {uid: '123545', name: 'foo bar'})
    end
    
[/code]

### spec/requests/authentication_spec.rb

[code]

    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
    
[/code]

としているのですが、テストには以下のエラーで失敗します。

[code]

    expected #has_content?("Facebook から承認されました。") to return true, got false
    
[/code]

`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 <

[code]

    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
    
[/code]

### app/models/user.rb

[code]

      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
    
[/code]


CC BY-SA 3.0
2015-09-30T10:47:27.503
17104
2015-10-31T06:46:35.347
2015-09-30T16:50:18.047
3271
3271
question
ruby-on-rails rspec oauth
Oauthでの認証をRspecの統合テストで確認する方法


コントローラーとモデルで使っている`auth`と request の環境変数の情報が不足していたのが原因だったので

### spec/requests/authentication_spec.rb

[code]

      before do
        # ~ 
        Rails.application.env_config["omniauth.params"] = {'user_type' => 'host'}
        # ~
      end
    
[/code]

### spec/support/omniauth.rb

[code]

      OmniAuth.config.add_mock(:facebook,
                               {'uid' => '123545',
                                'name' => 'foo bar',
                                'credentials' => {
                                    'token' => 'mock_token',
                                    'secret' => 'mock_secret'
                                }
                               }
      )
    
[/code]

と必要なmockを作成することで解決しました。


CC BY-SA 3.0
2015-10-01T05:46:36.727
17135
2015-10-01T05:46:36.727
3271
17104
answer