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对我不起作用<代码>参数错误:未知关键字:标题