web-dev-qa-db-ja.com

RailsでテストするときにHTTP_REFERERを設定するにはどうすればよいですか?

コントローラーをテストしようとしていますが、このエラーが発生しました。エラーは理解しましたが、修正方法がわかりません。

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'

それは彼らが意味するものですか?


OK、だから彼らはこれを行うことを意味することがわかります:

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 docs 具体的に言う これがヘッダーの設定方法です。

85
Ethan

彼らの推奨事項は次のようになります。

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

@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
44
Fotios

質問への回答:

なぜこれが機能しないのですか:

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

Railsあなたがリンクしたドキュメント はおそらくあなたが使用しているクラスとは異なるクラスをドキュメント化するため、機能しません。

ActionController::Integration:Sessionにリンクしました。機能テスト(Test :: Unitを使用している場合)またはコントローラーテスト(Rspecを使用している場合)を作成していると思います。いずれにせよ、おそらくActionController::TestCaseまたはそのサブクラスを使用しています。次に、モジュールActionController::TestProcessが含まれます。

ActionController::TestProcessは、ActionController::Integration:Sessionが提供するgetメソッドとは異なるパラメーターを持つgetメソッドを提供します。 (迷惑ですか?)メソッドのシグネチャは次のとおりです。

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

残念ながら、headersパラメーターはありません。しかし、少なくとも@request.env['HTTP_REFERER']の設定は機能します。

9
rlkw1024

Rails3でも同じエラーが発生しました:
「redirect_to:back」のレスキューを提供する対応コントローラーでこれを取り除くには

例:redirect_to :back rescue redirect_to required_path

1
rupsray
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' } }

代わりに。そして、リファラーを設定する必要があります

0
Bikash

上記の問題に対する最も簡単な解決策は、関連するヘッダーでリクエストを行うことです。 Railsはこのヘッダーを自動的に読み取ります。

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