簡體   English   中英

在 Rails 中測試時如何設置 HTTP_REFERER?

[英]How do I set HTTP_REFERER when testing in Rails?

我正在嘗試測試控制器,但出現此錯誤。 我理解錯誤,但不知道如何解決。

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 文檔特別說明這就是您設置標題的方式。

他們的建議轉化為以下內容:

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

接受的答案不適用於集成測試,因為@request變量不存在。

根據RailsGuides ,您可以將標頭傳遞給助手。

導軌 <= 4:

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

導軌 >= 5:

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

回答這個問題:

為什么這不起作用:

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']有效。

在 Rails3 中,我遇到了同樣的錯誤:
為了在相應的控制器中擺脫這一點,為“redirect_to :back”提供了救援

示例: redirect_to :back rescue redirect_to required_path

上述問題最直接的解決方案是使用關聯的標頭發出請求。 Rails 會自動讀取這個頭文件。

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

目前,我使用 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
setup do
  @request.env['HTTP_REFERER'] = 'http://test.com/sessions/new'
  post :create, { :user => { :email => 'invalid@abc' } }
end

在 Rails 2.2.2 中,上述塊從未運行過實際測試。 這么說

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

線路沒有運行。 您可以簡單地擺脫設置塊並使用

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

反而。 它應該設置引用者

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM