web-dev-qa-db-ja.com

rspecリクエスト仕様でリクエストヘッダーを設定するにはどうすればよいですか?

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

request.accept = "application/json"

ただし、要求仕様では、「request」オブジェクトはnilです。ここでどうすればいいですか?

Http acceptヘッダーをjsonに設定する理由は、次のようにするためです。

get '/my/path'

これの代わりに

get '/my/path.json'
120
Sergey

ここで説明するように、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"}
130
awaage

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

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

これは、リクエスト仕様ではなく、コントローラー仕様で機能しています:

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

Rails 5.1.rc1でこれを実行しようとして主に動けなくなったので、ここに追加します。

Getメソッドのシグネチャは現在わずかに異なります。

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

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

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

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

13
Jules Copeland

Rack::Test::Methodsでrspecを使用する

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

ヘッダー変数はX-Your-Header-Varとして渡されます

8
marcusb

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

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

Get/delete/....経由で送信しようとすると、Rails4では完全なゴミになり、ヘッダーとしてではなくパラメーターとして送信されるため、頭が痛くなります。

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

RSpec 3では、次の構文を使用できます

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

Rspecの公式ドキュメントに記載 (v3.7へのリンク)

4

xhr: trueとヘッダーの両方を送信するには、たとえば:

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

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

get :index, :format => 'json' 
3
gayavat

あなたの質問は既に回答されていますが、別のアクションにPOSTしたい場合は、これをしなければなりません:

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