【发布时间】: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