测试使用黄瓜的omniauth登录时,没有方法uid用于Hash错误

时间:2014-01-14 15:20:14

标签: testing twitter cucumber omniauth uid

我正在尝试编写涉及使用Omniauth登录的集成测试,特别是Twitter。每次运行Cucumber测试时我得到的错误是:

  

当我使用“Twitter”功能/ step_definitions / steps.rb登录时:5         未定义的方法uid' for #<Hash:0x007fa891f95830> (NoMethodError) ./app/models/user.rb:26:in from_omniauth'         ./app/controllers/omniauth_callbacks_controller.rb:4:in all' ./features/step_definitions/steps.rb:6:in / ^我用“(。*?)”$ /'登录         features / user_management.feature:15:在`当我使用“Twitter”'

登录时

以下是我的用户模型中的代码。

def self.from_omniauth(auth)
    user = where(twitter_uid: auth.uid).first || check_for_non_twitter_login(auth)
    user.twitter_oauth_token = auth.credentials.token
    user.twitter_oauth_secret = auth.credentials.secret
    user.save! if user.email != ""
    user
end

def self.create_from_omniauth(auth)
    create do |user|
      user.provider = auth.provider
      user.twitter_uid = auth.uid
      user.twitter_username = auth.info.nickname
      user.twitter_oauth_token = auth.credentials.token
      user.twitter_oauth_secret = auth.credentials.secret
    end
end

我尝试通过将相关行更改为:

来更改uid值的访问方式
user = where(twitter_uid: auth['uid']).first || check_for_non_twitter_login(auth)

这解决了这个错误,因此我更改了auth哈希中的所有数据提及以使用相同的方法。这打破了代码在开发中的工作方式(它根本不起作用),然后测试就抛出了这个错误:

  

当我使用“Twitter”功能/ step_definitions / steps.rb登录时:5         create_from_omniauth中的未定义方法[]' for nil:NilClass (NoMethodError) ./app/models/user.rb:56:in块         ./app/models/user.rb:53:in create_from_omniauth' ./app/models/user.rb:38:in check_for_non_twitter_login'         ./app/models/user.rb:26:in from_omniauth' ./app/controllers/omniauth_callbacks_controller.rb:4:in所有'         ./features/step_definitions/steps.rb:6:in /^I sign in with "(.*?)"$/' features/user_management.feature:15:in当我使用“Twitter”登录时

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

找到了解决方案。而不是使用:

OmniAuth.config.mock_auth ...etc

我用过:

OmniAuth.config.add_mock(:twitter, {"uid" => '12345', "credentials" => {"token" => "mytoken","secret" => "mysecret"} })

现在一切正常。