Ruby 如何在sinatra的rspec中使用omniauth?

Ruby 如何在sinatra的rspec中使用omniauth?,ruby,testing,rspec,sinatra,omniauth,Ruby,Testing,Rspec,Sinatra,Omniauth,缩短版: 使用用于sinatra的omniauth gem,我无法让rspec登录工作并保留会话以备后续请求 根据会议的建议和关闭会议,我将问题隔离到以下方面: app.send(:set,:sessions,false)#来自http://benprew.posterous.com/testing-sessions-with-sinatra 获取'/auth/google_oauth2/callback',nil,{“omniauth.auth”=>omniauth.config.mock_a

缩短版:

使用用于sinatra的omniauth gem,我无法让rspec登录工作并保留会话以备后续请求

根据会议的建议和关闭会议,我将问题隔离到以下方面:

app.send(:set,:sessions,false)#来自http://benprew.posterous.com/testing-sessions-with-sinatra
获取'/auth/google_oauth2/callback',nil,{“omniauth.auth”=>omniauth.config.mock_auth[:google_oauth2]}
#last_request.session=>{“uid”=>“22222222”,:flash=>{:success=>“Welcome”}
#上次_response.body=>“”
跟着你!
#last_request.session=>{:flash=>{}
#last_response.body=>主页的Html,这就是我想要的
如何让rspec遵循重定向并保留会话变量?这在西纳特拉可能吗

从中,似乎我必须在每个需要登录的get/post请求上发送会话变量,但这在重定向的情况下不起作用


详细信息:

我正在尝试使用sinatra中的omniauth gem,设置如下:

spec_helper.rb

ENV['RACK\u ENV']='test'
#包含web.rb文件
需要\u相对“../web”
#包含factories.rb文件
需要_relative'../test/factories.rb'
需要“rspec”
要求“机架/测试”
需要“工厂女孩”
需要“ruby调试”
#在所有rspec测试中包括Rack::Test
RSpec.configure do| conf|
conf.include Rack::Test::Methods
conf.mock_with:rspec
结束
web_spec.rb

描述“身份验证:”执行
在做之前
OmniAuth.config.test_mode=true
OmniAuth.config.add_mock(:google_oauth2{
:uid=>“2222222”,
:info=>{
:email=>“someone@example.com",
:name=>“某人”
}
})
结束
描述“以新用户身份登录”是什么
它“应该有用”吗
获取“/auth/google\u oauth2/”
最后一个回复应包括(“欢迎”)
结束
结束
结束
尝试进行身份验证时,我得到一个
未找到
响应。我错过了什么

在omniauth文档的页面上,它提到添加两个环境变量:

get '/auth/google_oauth2/callback', nil, {"omniauth.auth" => OmniAuth.config.mock_auth[:google_oauth2]}
follow_redirect!

last_response.body.should include("Welcome")
在做之前
request.env[“designe.mapping”]=designe.mappings[:user]
request.env[“omniauth.auth”]=omniauth.config.mock_auth[:twitter]
结束
但正如我所补充的,似乎只针对rails

request.env[“omniauth.auth”]=omniauth.config.mock\u auth[:google\u oauth2]
到我的规范中的
之前的
块,我得到以下错误:

失败/错误:request.env[“omniauth.auth”]=omniauth.config.mock\u auth[:google\u oauth2]
参数错误:
参数数目错误(0表示1)

编辑:

使用调用
get

get'/auth/google_oauth2/',nil,{“omniauth.auth”=>omniauth.config.mock_auth[:google_oauth2]}
似乎给了我
last_request.env[“omniauth.auth”]
等于

{“provider”=>“google_oauth2”、“uid”=>“22222222”、“info”=>{“email”=>”someone@example.com“,“name”=>“Someone”}
这似乎是正确的,但是
最后一次响应。body
仍然返回

未找到

部分答案

通过添加请求环境变量,回调url工作得更好:

get '/auth/google_oauth2/callback', nil, {"omniauth.auth" => OmniAuth.config.mock_auth[:google_oauth2]}
follow_redirect!

last_response.body.should include("Welcome")
但是,这不适用于重定向后的会话,这是我的应用程序知道有人登录所必需的。更新了问题以反映这一点。

使用(源自)存储会话数据,我得到了存储会话的测试,允许我将会话传递给其他请求

不过,可能有一个更简单的方法

设置代码:

#Omniauth设置
OmniAuth.config.test_mode=true
OmniAuth.config.add_mock(:google_oauth2{
:uid=>“2222222”,
:info=>{
:email=>“someone@example.com",
:name=>“某人”
}
})
#基于https://gist.github.com/375973 (来自https://stackoverflow.com/a/3892401/111884)
类SessionData
def初始化(cookies)
@饼干=饼干
@数据=cookies['rack.session']
如果@数据
@data=@data.unpack(“m*”)。首先
@data=Marshal.load(@data)
其他的
@数据={}
结束
结束
def[](键)
@数据[键]
结束
def[]=(键,值)
@数据[键]=值
会话_data=Marshal.dump(@data)
会话数据=[会话数据].pack(“m*”)
@cookies.merge(“rack.session={rack::Utils.escape(session_data)}”,URI.parse(“//example.org//”)
除非@cookies['rack.session']==会话数据,否则引发“未设置会话变量”
结束
结束
def登录!(届会)
获取'/auth/google_oauth2/callback',nil,{“omniauth.auth”=>omniauth.config.mock_auth[:google_oauth2]}
会话['uid']=上次请求。会话['uid']
#登录用户应具有与登录凭据相同的uid
session['uid'].should==OmniAuth.config.mock\u auth[:google\u oauth2]['uid']
结束
#基于Rack::Test::Session::follow\u重定向!
def follow_redirect_与_session_登录!(届会)
除非最后一次响应。重定向?
raise Error.new(“上一个响应不是重定向。无法遵循\u重定向!”)
结束
获取(最后一个_响应[“Location”],{},{“HTTP_REFERER”=>last_request.url,“rack.session”=>{“uid”=>session['uid']})
结束
def get_与_会话_登录(路径)
获取路径,nil,{“rack.session”=>{“uid”=>session['uid']}
结束
样本rspec代码:

描述“身份验证:”执行
def会话
SessionData.new(rack\u test\u session.instance\u variable\u get(:@rack\u mock\u session.cookie\u jar)
结束
描述“以新用户身份登录”是什么
它“应该用用户名创建一个新帐户”吗
登录!(届会)
最后一个请求。会话[:flash][:success]。应包括(“欢迎”)
使用会话获取会话,登录“/”
使用会话登录跟随重定向!(届会)
最后一个回复应该包括(“某人”)
结束
结束
结束

实际上,我需要会话才能登录工作