如何在RSpec中设置request.referrer?

时间:2012-09-25 22:04:41

标签: ruby-on-rails ruby rspec

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

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

referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message

6 个答案:

答案 0 :(得分:36)

ActionDispatch::TestRequest扩展了ActionDispatch::Request的{​​{1}}。

该方法定义如下

Rack::Request

据我记忆,您可以使用def referer @env['HTTP_REFERER'] end alias referrer referer 访问RSpec测试中的环境变量。这意味着,应该可以设置像

这样的东西
request.env

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

答案 1 :(得分:28)

嘲笑它:

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

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

controller.request.stub referer: 'http://example.com'

答案 2 :(得分:12)

在Rails 5上,已接受的解决方案似乎无法正常工作,但如Simone Carletti所示,直接设置request.env['HTTP_REFERER']可行。

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

get :endpoint, params: {}, headers: { 'HTTP_REFERER' => 'stackoverflow.com' }

答案 5 :(得分:0)

这也适用于控制器规格:

const Test = {
    a: { someProp: true },
    get b() {
       return  { ...Test.a, someOtherProp: true }
    }
}