2

これは、テストなしで採用されたRailsアプリです。統合テストでomniauthをテストしようとしていますが、エラーが発生します(これに基づいて編集しました: https ://github.com/intridea/omniauth/wiki/Integration-Testing )。これは、Rspecについての私の理解の欠如を反映しています。リクエストオブジェクトはデフォルトで利用可能であるように思われます。

私は私のspec/spec_helper.rbにあります:

config.include IntegrationSpecHelper, :type => :request
Capybara.default_host = 'http://localhost:3000'

OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(:facebook, {
  :uid => '12345'
})

そして私のspec/Integration / login_specで:

require 'spec_helper'

describe ServicesController, "OmniAuth" do
  before do
    puts OmniAuth.config.mock_auth[:facebook]
    puts request # comes back blank
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
  end

  it "sets a session variable to the OmniAuth auth hash" do
    request.env["omniauth.auth"][:uid].should == '12345'
  end
end 

次のエラーが発生します。

{"provider" => "facebook"、 "uid" => "12345"、 "user_info" => {"name" => "Bob Example"}}

F

失敗:

1)ServicesController OmniAuthは、セッション変数をOmniAuth認証ハッシュに設定します失敗/エラー:request.env ["omniauth.auth"] = OmniAuth.config.mock_auth [:facebook] NoMethodError:未定義のメソッドenv' for nil:NilClass # ./login_spec.rb:8:inブロック(2レベル)'

22.06秒で終了1例、1失敗

失敗した例:

rspec ./login_spec.rb:11#ServicesController OmniAuthは、セッション変数をOmniAuth認証ハッシュに設定します

デフォルトでは、リクエストオブジェクトをここで使用できるようにする必要がありますか?このエラーはおそらく他の何かを意味しますか?

どうも

4

1 に答える 1

8

nilまだリクエストを行っていないため、取得しています。

テストを機能させるには、次の3つのことを行う必要があります。

  1. モックを設定する
  2. リクエストする
  3. コールバックに添付されているコードをテストします

これが私のやり方です。最初にブロックにモックを設定してbeforeから、プロバイダーに対応するURL(この場合はFacebook)にアクセスします。

before do
  OmniAuth.config.add_mock(:facebook, {:uid => '12345'})
  visit '/auth/facebook'
end

ウィキから:

/ auth / Providerへのリクエストは、すぐに/ auth / Provider/callbackにリダイレクトされます。

したがって、「/ auth /:provider/callback」に一致するルートが必要です。マップするアクションが何であれ、上記のステップ3で実行する必要があります。

セッション変数がuidに設定されていることをテストする場合は、次のようにすることができます(上記のモックでuidを「12345」に設定したために機能します)。

it "sets a session variable to the OmniAuth auth hash" do
  session['uid'].should == '12345'
end

そして、これがこのパスを作るためのルートとアクションです:

ルート.rb

match '/auth/:provider/callback' => 'sessions#callback'

controllers / sessions_controller.rb

def callback
  session['uid'] = request.env["omniauth.auth"][:uid]
end

それがその要点です。お役に立てば幸いです。

于 2012-07-30T11:44:51.750 に答える