rspecリクエストスペックでリクエストヘッダーを設定する方法


127

コントローラーの仕様では、次のようにhttp acceptヘッダーを設定できます。

request.accept = "application/json"

しかし、リクエスト仕様では、「リクエスト」オブジェクトはnilです。どうすればここでそれを行うことができますか?

http acceptヘッダーをjsonに設定する理由は、これを実行できるようにするためです。

get '/my/path'

これの代わりに

get '/my/path.json'

回答:


130

ここで説明するように、get()メソッドの3番目の引数としてHTTPヘッダーを指定できるはずです。

http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

そしてここ

http://api.rubyonrails.org/classes/ActionDispatch/Integration/Session.html#method-i-process

だから、あなたはこのようなことを試すことができます:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}

3
「HTTP_ACCEPT」を使用する必要がありました: get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti

58
注:これは、以下のコメントに似た統合テスト用です。rspec-railsコントローラテストでは、次のように使用します。request.env["HTTP_ACCEPT"] =
Alex Soto

5
私がばかげているので私が遭遇した小さな落とし穴:ヘッダーキーは文字列でなければなりません。シンボルは表示されません。
ajmurmann 2013

@ajmurmann記号が機能するようになりました:authorization。「Authorization」ヘッダーはにすることができます。
フランクリンユ

13
新しいRSspec 3構文はget my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`のようになります
Cyril Duchon-Doris

39

私はこれをTest :: Unitで使用しました:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

3
同様に、Alex Sotoが別の回答のコメントで指摘しているように、rspec-railsコントローラーテストでは、次を使用できます。request.env["HTTP_ACCEPT"]
gerry3

たくさんの人に感謝します、古い2.3アプリで私のために働いた唯一の例ActionController::TestCase
ecoologic 2013

+1 Cookieヘッダーハッシュで指定されたキーを使用しようとしましたが(ブラウザーが送信するものだからです)、機能しませんでした。それから私はしrequest.keys、という名前のキーを見ましたHTTP_COOKIE。それを使ってうまくいった。彼らは本当にこれをよりよく文書化すべきです。
ケルビン

それは実際に動作します!私もgithub.com/rspec/rspec-rails/issues/65で
Stepan Zakharov

@Sytse Sijbrandij誰もTest :: Unitについて質問しませんでした。rspecに関する質問。
ブライアンディマス2016年

18

Rails 5.1.rc1でこれを実行しようとするのが非常に行き詰まったため、ここに追加します

getメソッドのシグネチャは少し異なります。

パスの後のオプションをキーワード引数として指定する必要があります。

get /some/path, headers: {'ACCEPT' => 'application/json'}

参考までに、キーワード引数の完全なセットは次のとおりです。

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


18

これはリクエストスペックではなく、コントローラースペックで機能します。

request.headers["My Header"] = "something"

2
使用している場合、これは私のために働いた、それは、あなたがヘッダを取得しているかに依存しrequest.headersたりrequest.env
エドガー・オルテガ

3
注:これはコントローラーテスト用であり、質問で言及されている統合テスト用ではありません。
フランクリンユ

3
統合テストでは機能しませんでした。ただし、コントローラーテストで動作します。
Petr Gazarov 2017年

9

ヘッダーを個別に設定する必要があります

request.headers["Accept"] = "application/json"

get / delete / ...を介して送信しようとすると、rails4の完全なガベージであり、ヘッダーではなくパラメーターとして送信されるため、頭が痛くなります。

{"Accept" => "application/json"}

5
これは本当にOP質問への回答を提供しますか?新しい質問の場合は、新しい質問を開くことをお勧めします。
β.εηοιτ.βε



5

xhr: trueとヘッダーの両方を送信するには、たとえば次のようにする必要があります。

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers

1
ここでのGitHub上のソースコードがあります:github.com/rails/rails/blob/...
カール・ウィルバー

すべきではheaders =ないmy_headers =
webaholik 2018

修繕。@webaholikに感謝します。
ジムスチュワート

2

あなたの質問はすでに回答されていますが、別のアクションに何かをPOSTしたい場合は、これを行う必要があります:

post :save, {format: :json, application: {param1: "test", param2: "test"}}

2

次のようなものを試してください:

get :index, :format => 'json' 

確かではありませんが、おそらくレールはそのルートの.formatを探しているので機能します。これもたまたま私のために働きました。
アラン・

2
誰かが疑問に思っている場合に備えて、これは単にformat=jsonクエリパラメータとして追加されます。ヘッダーフィールドと同じではありません。
Kevin Carmody
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.