在Rails中进行测试时如何设置HTTP_REFERER?


87

我正在尝试测试控制器,但出现此错误。我了解该错误,但不知道如何解决。

test: on CREATE to :user with completely invalid email should respond with 
  redirect
(UsersControllerTest):ActionController::RedirectBackError: 
  No HTTP_REFERER was set in the request to this action, 
  so redirect_to :back could not be called successfully. 
If this is a test, make sure to specify request.env["HTTP_REFERER"].

指定在哪里?我尝试了这个:

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

但是得到了同样的错误。

到底用什么指定它?我想我希望它返回的视图的URI:

'/sessions/new'

那是什么意思吗?


好的,事实证明他们是这样做的:

setup do
  @request.env['HTTP_REFERER'] = 'http://localhost:3000/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }, {}
end

有人可以告诉我记录在哪里吗?我想阅读这些信息的内容。

如果域不是“ localhost:3000”怎么办?如果是“ localhost:3001”之类的怎么办?有什么预料到吗?

为什么这样不起作用:

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
  { 'referer' => '/sessions/new' } }

Rails文档专门指出了设置标题的方式。

Answers:


90

他们的建议翻译如下:

setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end

1
您只需指定相对路径即可,例如'/ sessions / new'。
Martin Faartoft 2011年

这对我不起作用,因为我正在使用https =>'on'。现在要做什么?
罗伯特·雷兹

47

接受的答案不适用于集成测试,因为 @request变量不存在。

根据RailsGuides的介绍,您可以将标头传递给助手。

Rails <= 4:

test "blah" do
  get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
  ...
end

Rails> = 5:

test "blah" do
  get root_path, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://foo.com" }
  ...
end

2
非常感谢。我搜索了1个小时以寻求解决方案。您的帖子对我有用!
罗伯特·雷兹

9
在Rails 5上,标头指定如下:get :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } source
golfadas 16'Aug8

9

针对这个问题:

为什么这样不起作用:

setup { post :create, { :user => { :email => 'invalid@abc' } }, 
{ 'referer' => '/sessions/new' } }

它不起作用,因为您链接到的Rails文档记录的类与您可能正在使用的类不同。

您已连结至ActionController::Integration:Session。我猜您正在编写功能测试(如果使用Test :: Unit)或控制器测试(如果使用Rspec)。无论哪种方式,您都可能使用ActionController::TestCase或其子类。依次包含模块ActionController::TestProcess

ActionController::TestProcess提供了一个get具有不同参数比方法get通过提供的方法ActionController::Integration:Session。(烦人吧?)方法签名是这样的:

 def get(action, parameters = nil, session = nil, flash = nil)

可悲的是,没有headers参数。但至少设置@request.env['HTTP_REFERER']有效。


1

在Rails3中,我遇到了相同的错误:
要在相应的控制器中摆脱此错误,请为“ redirect_to:back”提供救援。

示例:redirect_to :back rescue redirect_to required_path


0
setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end

在Rails 2.2.2中,以上代码块从未进行过实际测试。这样说

帖子:create,{:用户=> {:电子邮件=>'invalid @ abc'}}

线未运行。您可以简单地摆脱设置块并使用

@request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
post :create, { :user => { :email => 'invalid@abc' } }

代替。它应该设置引荐来源


0

解决上述问题的最直接的方法是使用关联的标头进行请求。Rails将自动读取此标头。

post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}

0

当前,我使用Rails 5.2.1,我在控制器内部存根请求引用的方法如下:

let(:stub_referer) { some_path(some_param) }
before do
  request.headers.merge! referer: stub_referer
  get :some_action, format: :html
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.