Ruby on rails 如何在我的RSpec中设置request.Referer?
我试图避免使用我的Ruby on rails 如何在我的RSpec中设置request.Referer?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我试图避免使用我的会话[:refered\u by],并希望使用请求。referer。但是,我的RSpec测试失败,因为TestRequest没有存储请求。referer 因此,为了使Rspec测试正常工作,我必须执行以下操作。有没有办法让它变得更好: referrer = request.referrer ? request.referrer : '/' redirect_to referrer, :alert => error_message 嘲弄它: specify 'foo' d
会话[:refered\u by]
,并希望使用请求。referer
。但是,我的RSpec测试失败,因为TestRequest
没有存储请求。referer
因此,为了使Rspec测试正常工作,我必须执行以下操作。有没有办法让它变得更好:
referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message
嘲弄它:
specify 'foo' do
controller.request.should_receive(:referer).and_return('http://example.com')
# get whatever
end
或者,如果您不在乎它是否被呼叫,请将其存根:
controller.request.stub referer: 'http://example.com'
ActionDispatch::TestRequest
扩展ActionDispatch::Request
扩展Rack::Request
该方法定义如下
def referer
@env['HTTP_REFERER']
end
alias referrer referer
据我所知,您可以使用request.env
在RSpec测试中访问环境变量。这意味着,应该可以设置如下内容
request.env['HTTP_REFERER'] = 'http://example.com'
当然,这取决于您使用的RSpec示例组的类型。在Rails 5上,已接受的解决方案似乎不再有效,但直接设置
request.env['HTTP\u REFERER']
会起作用,正如所建议的那样。对于搜索此示例组的任何其他人,您也可以在助手规范中存根请求,如下所示:
allow(view).to receive_message_chain(:request, :referrer).and_return("http://example.com")
get '/posts', {}, { referer: 'http://example.com' }
对于Rails4/Rspec3,在请求规范中,
request
在您进行http调用之前不可用。但您可以通过执行以下操作来分配request.referer:
allow(view).to receive_message_chain(:request, :referrer).and_return("http://example.com")
get '/posts', {}, { referer: 'http://example.com' }
Rails 5.2+和RSpec 3.8的解决方案+
get:endpoint,参数:{},头:{'HTTP_REFERER'=>'stackoverflow.com'}
这也适用于控制器规格:
controller.request.headers.merge({ 'HTTP_REFERER': 'https://stackoverflow.com/' })
get(:endpoint)
request.env['HTTP\u REFERER']='http://example.com“
为我工作。Rspec版本是3.4.4。Simone Carletti的答案更简洁,因为它可以处理referer
/referer
的两种拼写。如果头文件已经存在(通常用于身份验证),我们可以将它们合并为:头文件:头文件。合并({'HTTP\u referer'=>'stackoverflow.com')
@Lucas Caton对我不起作用<代码>参数错误:未知关键字:标题