我正在尝试在我的应用中测试omniauth-facebook集成,但我不断遇到这种失败:
Failure/Error: get :facebook
NoMethodError:
undefined method `extra' for nil:NilClass
# ./app/models/user.rb:17:in `find_for_facebook_oauth'
# ./app/controllers/users/omniauth_callbacks_controller.rb:4:in `facebook'
# ./spec/controllers/users/omniauth_callbacks_controller_spec.rb:18:in `block (4 levels) in <top (required)>'
以下是引发失败的代码行:
user.rb :
def self.find_for_facebook_oauth(auth, signed_in_resource=nil)
data = auth.extra.raw_info # this is line 17
if user = User.where(:email => data.email).first
user
else
user = User.new
user
end
end
omniauth_callbacks_controller.rb :
def facebook
@user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user) # this is line 4
if @user.persisted?
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
sign_in_and_redirect @user, :event => :authentication
else
flash[:notice] = "Authentication was successful, please continue your registration process."
session["devise.facebook_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
omniauth_callbacks_controller_spec.rb :
before(:each) do
stub_env_for_omniauth
get :facebook # this is line 18
@user = User.where(:email => "ghost@nobody.com").first
end
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
这是 spec_helper.rb :
require 'omniauth'
OmniAuth.config.test_mode = true
有什么想法吗?
答案 0 :(得分:1)
而不是@controller.stub!
我认为你应该设置
request.env["omniauth.auth"] = env
在此处了解有关测试omniauth的更多信息https://github.com/intridea/omniauth/wiki/Integration-Testing
答案 1 :(得分:1)
嘿,只需在 facebook 方法
中添加以下内容def facebook
raise request.env["omniauth.auth"].to_yaml
....
end
然后检查您从facebook-omniauth获得的回复。这可能有助于您检测问题。