我正在尝试避免使用我的session[:referred_by]
,并希望使用request.referrer
。但是,我的RSpec测试失败是因为TestRequest
没有存储request.referrer
所以我必须执行以下操作才能使Rspec测试正常工作。有没有办法让它变得更好:
referrer = request.referrer ? request.referrer : '/'
redirect_to referrer, :alert => error_message
答案 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)
get :endpoint, params: {}, headers: { 'HTTP_REFERER' => 'stackoverflow.com' }
答案 5 :(得分:0)
这也适用于控制器规格:
const Test = {
a: { someProp: true },
get b() {
return { ...Test.a, someOtherProp: true }
}
}