コントローラーをテストしようとしていますが、このエラーが発生しました。エラーは理解しましたが、修正方法がわかりません。
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 具体的に言う これがヘッダーの設定方法です。
彼らの推奨事項は次のようになります。
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
は、ActionController::Integration:Session
が提供するget
メソッドとは異なるパラメーターを持つget
メソッドを提供します。 (迷惑ですか?)メソッドのシグネチャは次のとおりです。
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
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' } }
代わりに。そして、リファラーを設定する必要があります
上記の問題に対する最も簡単な解決策は、関連するヘッダーでリクエストを行うことです。 Railsはこのヘッダーを自動的に読み取ります。
post '/your-custom-route', {}, {'HTTP_REFERER': 'http://www.your-allowed-domain.com'}