2017-01-04 39 views
0

RSpecとOmniAuthで認証されたコントローラをテストしようとしています。私は自分のwikiのintegration testingガイドに従っています。未定義メソッド `provider 'for nil:NilClass、RSpec、OmniAuth

Failure/Error: 
     where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.first_name = auth.info.first_name 
     user.last_name = auth.info.last_name 
     user.email = auth.info.email 
     user.picture = auth.info.image 
     user.save! 
     end 

    NoMethodError: 
     undefined method `provider' for nil:NilClass 

関連するすべてのコードは、このgistで提供されています。私は、テストを実行すると、私は次のエラーを取得します。私の感想は、模擬認証ハッシュが何とか設定されていないことですが、私はそれを検証する方法がありません。 OmniAuthをconfig/environments/test.rbに設定しています(Gistに表示されています)、アプリケーション起動時にファイルが実行されていることを確認しています。

答えて

1

私にはいくつかの問題があります。 1つは、サインインの動作をテストしていないことです。リクエスト内でoauthデータを使用してコントローラーアクションを実行し、認証に合格することを期待しています。 OauthのデータはAPIキーと似ていないので、そのような自動サインインはできません。 omn​​iauthが提供する特定のサインインアクションを実行すると、ユーザーのセッションが設定されます。これは、oauthサインイン戦略全体が期待通りに機能することを確認するために、独自にテストする必要があります。 oauthサインインの動作に直接関係しないコントローラの動作をテストする場合は、認証が必要なテストを実行する前にthe devise test helpersを使用してサインインする必要があります。

また、環境の初期設定でOmniAuth設定を設定したくない場合もあります。ドキュメンテーションは示唆し、私が自分自身で行うことは、テストで設定を下げることです。 1つは、さまざまな種類のシナリオをテストできます。たとえば、omniauthコールバックコントローラが動作していることをテストし、私が望むことを実行する方法です。

context 'with valid google credentials' do 
    # this should actually be created in a factory 
    let(:provider) { :google_oauth2 } 
    let(:oauth) { OmniAuth::AuthHash.new provider: provider, uid: '1234' } 
    before do 
    OmniAuth.config.test_mode = true 
    OmniAuth.config.mock_auth[provider] = oauth 
    end 

    it 'creates a new user' do 
    expect { visit "https://stackoverflow.com/users/auth/#{provider}" }.to change(User, :count).by(1) 
    end 
end 
+0

返信いただきありがとうございます。私は未定義のメソッド 'visit'エラーを取得します。 'rails_helper 'と' rspec-rails'がインストールされているだけです。 – Carpetfizz

+0

'capybara'を' visit'メソッドを定義しているようにインストールしましたが、まだエラーが出ています。 – Carpetfizz

+1

あなたの 'rails_helper.rb'に' require 'capybara/rails''を追加しましたか? – mroach