Devise 1.5 + Omniauth 1.0 + Facebook:未定義メソッド `extra`

Devue 1.5とOmniauth 1.0で動作するキュウリのテストをFacebook認証で取得しようとしています。面白いのは、開発モードで動作しますが、Cukesテストを実行すると、このメッセージで失敗します:

undefined method `extra' for # (NoMethodError)
./app/models/user.rb:13:in `find_for_facebook_oauth'
./app/controllers/users/omniauth_callbacks_controller.rb:4:in `facebook'
(eval):2:in `click_link'
./features/step_definitions/web_steps.rb:58:in `/^(?:|I )follow "([^"]*)"$/'
features/facebook_auth.feature:11:in `When I follow "Sign in with Facebook"'

Here is the corresponding method:

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil)

    data = access_token.extra.raw_info
    if user = User.where(:email => data.email).first
        user
    else 
        User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
    end
end

To get the Cukes test to be all green, I had to do this workaround, which then breaks the Development mode code. So for now, I'm doing this:

    case Rails.env
    when "test"
        data = access_token['extra']['user_hash']
        if user = User.find_by_email(data["email"])
            user
        else 
            User.create!(:email => data["email"], :password => Devise.friendly_token[0,20])
        end
    else
        data = access_token.extra.raw_info
        if user = User.where(:email => data.email).first
            user
        else 
            User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
        end
    end     

Seems like the offending line is data = access_token.extra.raw_info.

The way I'm mocking the Facebook hash is:

OmniAuth.config.add_mock(:facebook, {
    :uid => '12345',
    :nickname => 'zapnap',
    :extra => {
      :user_hash => {
        'email' => '[email protected]'
      }
    }
  })

And I have turned on OmniAuth.config.test_mode = true by appending it at the last line of test.rb.

Any ideas would be greatly appreciated!

2

3 答え

stub_env_for_omniauthメソッドの代わりに、spec_helper.rbに設定を置くことができます。

  OmniAuth.config.test_mode = true
  OmniAuth.config.full_host = 'http://example.com'

  omni_hash = {
    'uid' => '12345',
    'provider' => 'facebook',
    "info" => {
      "email" => Faker::Internet.email,
      "image" => "http://example.com/pic.img"
     },
    "extra" => {
      "raw_info" => {
        "first_name" => Faker::Name.first_name,
        "last_name" => Faker::Name.last_name,
        "name" => Faker::Internet.user_name,
        "gender" => "male",
        "locale" => "en"
      }
    }
  }
  OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(omni_hash)
3
追加された

私はまったく同じエラーを受けて、どうにかしてそれを緑色にすることができました。 私はモックの代わりにスタブを使用していますが ここに書かれているように、それが助けになることを願っています。

ここで議論されているように、これはOmniAuth1.0がHashie :: Mashを私たちはエラーを受けました。 だから、Hashieの代わりにHashie :: Mashオブジェクトを使って返すことにしました。 そうするためには、

私はこれをspec_helperに追加しました..

require "omniauth"

このような変更されたスタブメソッド。

def stub_env_for_omniauth
  request.env["devise.mapping"] = Devise.mappings[:user]
  pre = { "omniauth.auth" => { "provider" => "facebook", "uid" => "1234", "credentials" => {"token" => "abcdefg"}, "extra"=>{"raw_info" => {"id" => "1234567", "email" => "[email protected]", "name" => "Mark", "gender" => "male" }}}}
  env = OmniAuth::AuthHash.new(pre)
  @controller.stub!(:env).and_return(env)
end

これは私のために働く。

2
追加された
どのようにキュウリ試験でこの仕事をしましたか?これはrspec関連のようです...
追加された 著者 Karan,
どういたしまして!私は rel="nofollow noreferrer">リンクからパッチを使用しようとしましたが、まだ運がありません。しかしそれは良い考えです。ありがとうございました!
追加された 著者 Benjamin Tan Wei Hao,
おっと、私はあなたが問題を開いたことに気がつきました。ありがとうございました:)
追加された 著者 Yuichi Nakano,

キュウリ試験のために追加のモックオブジェクトが動作するようです:

Given /^a new facebook user "([^"]*)"$/ do |name|
  OmniAuth.config.test_mode = true
  OmniAuth.config.mock_auth[:facebook] = {
    :provider => 'facebook',
    :uid => '123545',
    :name => name}

  m = mock("mock_extra",
    :raw_info => 
      mock("mock_raw_info", 
        :email => '[email protected]',
        :first_name => name,
        :last_name => "xyz"))

  OmniAuth.config.mock_auth[:facebook].stub(:extra).and_return(m)        
end
1
追加された