Я пытаюсь заставить мой тест 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
.
Любые идеи будут с благодарностью!