Разработать 1.5 + Omniauth 1.0 + Facebook: неопределенный метод `extra` - PullRequest
2 голосов
/ 19 декабря 2011

Я пытаюсь заставить мой тест Cucumber работать с Devise 1.5 и Omniauth 1.0 с аутентификацией Facebook. Забавно то, что он работает в режиме разработки, но при запуске теста Кьюкса он выдает следующее сообщение:

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

Чтобы тест Кьюкса был полностью зеленым, мне пришлось сделать этот обходной путь, который затем нарушает код режима разработки. Итак, сейчас я делаю это:

    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.

Любые идеи будут с благодарностью!

Ответы [ 3 ]

3 голосов
/ 22 марта 2013

Вы можете поместить настройки в 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)
2 голосов
/ 23 декабря 2011

Я получил точно такую ​​же ошибку и мог каким-то образом заставить ее быть зеленой.Хотя я использую заглушку вместо mock , как написано здесь , надеюсь, это может помочь.

Как обсуждается здесь , это происходит потому, что 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

Это работает для меня.

1 голос
/ 18 мая 2012

Для тестов на огурец кажется, что работает дополнительный фиктивный объект:

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
...