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