2

我正在为 Facebook 集成编写测试。当我运行 rspec 时,出现以下错误

 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'   => 'test@gmail.com',
      '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|

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

4

1 回答 1

2

你的代码应该是这样的:

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

这是因为auth在这个实例中是一个Hash对象,并且Hash对象不响应与它们的键同名的方法。相反,您应该只使用该Hash#[]方法(正如我所演示的)来访问这些键的值。

于 2013-07-28T23:49:56.330 回答