5

私はgem wikiを見て指示に従いましたが、何らかの理由でnilomniauthテストを行っているときに取得しています:

user_sessions_controller_spec.rb:

require 'spec_helper'

describe UserSessionsController, "OmniAuth" do
  before do
    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 == '123545'
  end
end

spec_helper.rb:

RACK_ENV = ENV['ENVIRONMENT'] ||= 'test'
OmniAuth.config.test_mode = true
omniauth_hash =
    {:provider => "facebook",
     :uid      => "1234",
     :info   => {:name       => "John Doe",
                 :email      => "johndoe@email.com"},
     :credentials => {:token => "testtoken234tsdf"}}

OmniAuth.config.add_mock(:facebook, omniauth_hash)

仕様結果:

Failures:

  1) UserSessionsController OmniAuth sets a session variable to the OmniAuth auth hash
     Failure/Error: request.env["omniauth.auth"]['uid'].should == '123545'
     NoMethodError:
       You have a nil object when you didn't expect it!
       You might have expected an instance of Array.
       The error occurred while evaluating nil.[]
     # ./spec/controllers/user_sessions_controller_spec.rb:10:in `block (2 levels) in <top (required)>'
4

1 に答える 1

4

文字列ではなく、テストでシンボルを試してください。

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

ある時点で Omniauth が文字列から記号に変更されたかどうかはわかりませんが、文字列をキーとして使用する例は数多くあるようです。

完全を期すために、Devise と Omniauth でこれを行おうとしている人がいる場合は、before ブロックに devise.mapping を追加することを忘れないでください。

before do
  request.env["devise.mapping"] = Devise.mappings[:user]
  request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
end
于 2012-05-09T18:10:41.213 に答える