ruby-on-rails - 设计 1.5 + Omniauth 1.0 + Facebook : undefined method `extra`

标签 ruby-on-rails ruby-on-rails-3 facebook devise omniauth

我正在尝试让我的 Cucumber 测试与 Devise 1.5 和 Omniauth 1.0 一起使用,并使用 Facebook 身份验证。有趣的是,它在开发模式下工作,但是当运行 Cukes 测试时,它失败并显示以下消息:

undefined method `extra' for #<Hash:0x007f95f0d26260> (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"'

对应的方法如下:

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

为了让 Cukes 测试全部变为绿色,我必须采用此变通方法,这会破坏开发模式代码。所以现在,我正在这样做:

    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     

似乎违规行是 data = access_token.extra.raw_info

我 mock Facebook 哈希的方式是:

OmniAuth.config.add_mock(:facebook, {
    :uid => '12345',
    :nickname => 'zapnap',
    :extra => {
      :user_hash => {
        'email' => 'someone@webs.com'
      }
    }
  })

我通过将 OmniAuth.config.test_mode = true 附加到 test.rb 的最后一行来启用它。

任何想法将不胜感激!

最佳答案

您可以将设置放在 spec_helper.rb 中,作为 stub_env_for_omniauth 方法的替代方法。

  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)

关于ruby-on-rails - 设计 1.5 + Omniauth 1.0 + Facebook : undefined method `extra` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8556439/

相关文章:

ruby-on-rails - 我将如何过滤掉子文档?

ruby - 如何使用 Imagemagick 给图像加水印?

ruby-on-rails - rails 3 与回形针和多个模型的多态关联

java - facebook:使用 restfb 将照片发布到时间线

ruby-on-rails - I18n :Module 的未定义方法 `translate'

ruby-on-rails - 如何在_form 中的标签之间保留逗号?

c# - 从具有指定字段的 Facebook 页面获取帖子

java - react native : error: cannot find symbol after upgrade

ruby-on-rails - 添加表单助手方法

ruby-on-rails - Ruby map/collect 在大型 Mongoid 集合上运行缓慢