我正在尝试编写涉及使用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:inall' ./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:increate_from_omniauth' ./app/models/user.rb:38:in
check_for_non_twitter_login' ./app/models/user.rb:26:infrom_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”登录时
任何人都知道我做错了什么?
答案 0 :(得分:1)
找到了解决方案。而不是使用:
OmniAuth.config.mock_auth ...etc
我用过:
OmniAuth.config.add_mock(:twitter, {"uid" => '12345', "credentials" => {"token" => "mytoken","secret" => "mysecret"} })
现在一切正常。