【问题标题】:Devise 1.5 + Omniauth 1.0 + Facebook: undefined method `extra`设计 1.5 + Omniauth 1.0 + Facebook:未定义的方法`extra`
【发布时间】:2011-12-19 02:06:21
【问题描述】:

我正在尝试让我的 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

我嘲笑 Facebook 哈希的方式是:

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

我已经打开OmniAuth.config.test_mode = true,将它附加到test.rb的最后一行。

任何想法将不胜感激!

【问题讨论】:

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


    【解决方案1】:

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

    OmniAuth.config.test_mode = true OmniAuth.config.full_host = 'http://example.com' 全向哈希 = { 'uid' => '12345', '提供者' => '脸书', “信息” => { "email" => Faker::Internet.email, “图片”=>“http://example.com/pic.img” }, “额外” => { “原始信息” => { "first_name" => Faker::Name.first_name, "last_name" => Faker::Name.last_name, "name" => Faker::Internet.user_name, “性别” => “男性”, "语言环境" => "en" } } } OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(omni_hash)

    【讨论】:

      【解决方案2】:

      我得到了完全相同的错误,并且可以以某种方式使其全部变为绿色。 虽然我使用存根而不是模拟 as is written here,希望对您有所帮助。

      正如here 所讨论的那样,这是因为 OmniAuth1.0 使用 Hashie::Mash 作为我们得到错误的部分。 因此,我们想出使用 Hashie::Mash 对象来返回而不是 Hash。 为此,

      我将此添加到 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" => "ghost@nobody.com", "name" => "Mark", "gender" => "male" }}}}
        env = OmniAuth::AuthHash.new(pre)
        @controller.stub!(:env).and_return(env)
      end
      

      这对我有用。

      【讨论】:

      • 糟糕,我刚刚注意到您打开了这个问题。谢谢你:)
      • 不客气!我尝试使用来自link 的补丁,但仍然没有运气。但这是个好主意。谢谢!
      • 您是如何使用 Cucumber 测试完成这项工作的?这似乎与 rspec 相关...
      【解决方案3】:

      对于 Cucumber 测试,一个额外的模拟对象似乎可以工作:

      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 => 'someone@webs.com',
              :first_name => name,
              :last_name => "xyz"))
      
        OmniAuth.config.mock_auth[:facebook].stub(:extra).and_return(m)        
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多