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


87

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

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のドキュメントでは特に、ヘッダーを設定する方法を説明しています。

回答:


90

彼らの勧告は次のように解釈されます:

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

1
'/ sessions / new'のように、相対パスを指定するだけで済むようになります。
Martin Faartoft、2011

https => 'on'を使用しているため、これは私にとっては機能しません。今何をする?
Robert Reiz 2013

47

@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

2
どうもありがとう。解決策を1時間検索しました。あなたの投稿は私にとってうまくいきます!
Robert Reiz 2013

9
:Railsの5で、ヘッダが同様に指定されget :show, params: { id: 12 }, headers: { "HTTP_REFERER" => "http://example.com/home" } たソース
golfadas

9

質問への回答:

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

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)

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


1

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

例:redirect_to :back rescue redirect_to required_path


0
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

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

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

0

現在、私は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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.