在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,因为@request
variables不存在。
根据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'}