如何在RSpec中设置request.referrer?

我试图避免使用我的session[:referred_by] ,并希望使用request.referrer 。 但是,我的RSpec测试失败,因为TestRequest不存储request.referrer

所以我必须执行以下操作才能使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扩展了扩展Rack::Request 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_REFERER'] ,正如Simone Carletti建议的那样有效。

对于其他任何人谷歌搜索这个,你也可以在一个帮助器规范中存根请求,如下所示:

 allow(view).to receive_message_chain(:request, :referrer).and_return("http://example.com") 

使用Rails4 / Rspec3,在请求规范中,在您进行http调用之前, request不可用。 但您可以通过执行以下操作来分配request.referer:

 get '/posts', {}, { referer: 'http://example.com' }