如何在RSpec中设置request.referrer?

Kam*_*i81 26 ruby rspec ruby-on-rails

我试图避免使用我的session[:referred_by],并想使用request.referrer.但是,我的RSpec测试失败,因为TestRequest它没有存储request.referrer

所以我必须执行以下操作才能使Rspec测试工作.有没有办法让它变得更好:

referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message
Run Code Online (Sandbox Code Playgroud)

Sim*_*tti 41

ActionDispatch::TestRequest扩展ActionDispatch::Request延伸Rack::Request.

该方法定义如下

def referer
  @env['HTTP_REFERER']
end
alias referrer referer
Run Code Online (Sandbox Code Playgroud)

据我记忆,您可以使用在RSpec测试中访问环境变量request.env.这意味着,应该可以设置类似的东西

request.env['HTTP_REFERER'] = 'http://example.com'
Run Code Online (Sandbox Code Playgroud)

当然,这取决于您使用的RSpec示例组的类型.

  • `request.env ['HTTP_REFERER'] ='http:// example.com'为我工作.Rspec版本是3.4.4 (3认同)

Mor*_*ori 28

嘲笑它:

specify 'foo' do
  controller.request.should_receive(:referer).and_return('http://example.com')
  # get whatever
end
Run Code Online (Sandbox Code Playgroud)

或者,如果您不关心它是否被调用,则将其存根:

controller.request.stub referer: 'http://example.com'
Run Code Online (Sandbox Code Playgroud)


Phi*_*sch 12

在Rails 5上,接受的解决方案似乎并不适用,但request.env['HTTP_REFERER']正如Simone Carletti建议的那样直接设置可行.


Luc*_*ton 6

Rails 5.2+ 和 RSpec 3.8+ 的解决方案

get :endpoint, params: {}, headers: { 'HTTP_REFERER' => 'stackoverflow.com' }
Run Code Online (Sandbox Code Playgroud)

  • @Lucas Caton 不适合我。`ArgumentError:未知关键字:标题` (3认同)