[英]Rails error: No HTTP_REFERER was set in the request to this action
[英]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 ,您可以將標頭傳遞給助手。
test "blah" do
get root_path, {}, {'HTTP_REFERER' => 'http://foo.com'}
...
end
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.