如何在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' }