2013-07-28 44 views
2

我正在为Facebook集成编写测试。当我运行rspec的,我得到以下错误使用水豚/ Rspec为Facebook测试OAuth

Failure/Error: before { click_link "Sign in with Facebook" } 
NoMethodError: 
undefined method `provider' for #<Hash:0x007fbe98511798> 
# ./app/models/user.rb:55:in `from_omniauth' 

我的OAuth模拟包含

OmniAuth.config.test_mode = true 
OmniAuth.config.mock_auth[:facebook] = { 
    'uid'  => "999999", 
    'provider' => "facebook", 
    'extra'  => { 
    'user_hash' => { 
     'email' => '[email protected]', 
     'first_name' => 'First', 
     'last_name' => 'Last', 
     'gender' => 'Male' 
    } 
    }, 
    'credentials' => { 
    'token' => "token1234qwert" 
    } 
} 

它显然打破了确切地点是

def self.from_omniauth(auth) 
    where("fb_provider = ? and fb_uid = ?", auth.provider, auth.uid.to_s).first_or_initialize.tap do |user| 

但是当我做了puts auth.to_yaml作为第一行from_omniauth(auth)它显示provider: facebook以及我在模拟验证中包含的所有其他内容。我迷失在这一点上。任何建议或帮助,将不胜感激。谢谢。

回答

2

您的代码应该是这样的:

where("fb_provider = ? and fb_uid = ?", auth['provider'], auth['uid'].to_s ... 

这是因为auth在这种情况下是一个Hash对象和Hash对象不以相同的名称作为自己的密钥的方法作出回应。相反,您应该使用Hash#[]方法 - 正如我所演示的 - 访问这些键的值。