在Rails中testing时如何设置HTTP_REFERER?

我试图testing一个控制器,我得到了这个错误。 我了解错误,但不知道如何解决。

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' 

这是什么意思?


好的,所以事实certificate他们是这样做的:

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

有人可以告诉我在哪里logging? 我想了解这些信息的背景。

如果域名不是“localhost:3000”呢? 如果是“localhost:3001”或什么的? 任何方式来预测?

为什么不工作:

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

Rails文档具体说这就是你如何设置标题。

他们的build议转化为以下内容:

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

接受的答案不适用于集成testing,因为@requestvariables不存在。

根据RailsGuides ,您可以将头传递给助手。

对于我的testing,我必须这样做,它完美的工作:

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

针对这个问题回答:

为什么不工作:

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

它不起作用,因为您链接的Rails文档与您可能使用的文档不同。

您链接到ActionController::Integration:Session 。 我猜你正在编写一个functiontesting(如果你正在使用Test :: Unit)或者一个控制器testing(如果你使用的是Rspec)。 无论哪种方式,你可能使用ActionController::TestCase或其子类。 其中又包含模块ActionController::TestProcess

ActionController::TestProcess提供的get方法的参数不同于ActionController::Integration:Session提供的get方法。 (烦人的,呃?)方法签名是这样的:

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

可悲的是,没有头参数。 但至less设置@request.env['HTTP_REFERER']工作。

在Rails3中,我得到了同样的错误:
为了摆脱这个在相应的控制器提供了“redirect_to:back”

例如: redirect_to :back rescue redirect_to required_path

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

在Rails 2.2.2中,上面的块从来没有经过实际的testing。 说这个

post:create,{:user => {:email =>'invalid @ abc'}}

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

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

代替。 它应该设置引用者

上述问题的最直接的解决scheme是使用相关联的标头进行请求。 Rails会自动读取这个头文件。

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