コントローラの仕様では、次のようにhttp acceptヘッダーを設定できます。
request.accept = "application/json"
ただし、要求仕様では、「request」オブジェクトはnilです。ここでどうすればいいですか?
Http acceptヘッダーをjsonに設定する理由は、次のようにするためです。
get '/my/path'
これの代わりに
get '/my/path.json'
ここで説明するように、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"}
Test :: Unit:でこれを使用しました
@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index
これは、リクエスト仕様ではなく、コントローラー仕様で機能しています:
request.headers["My Header"] = "something"
Rails 5.1.rc1でこれを実行しようとして主に動けなくなったので、ここに追加します。
Getメソッドのシグネチャは現在わずかに異なります。
キーワード引数としてパスの後にオプションを指定する必要があります。
get /some/path, headers: {'ACCEPT' => 'application/json'}
参考までに、キーワード引数の完全なセットは次のとおりです。
params: {}, headers: {}, env: {}, xhr: false, as: :symbol
Rack::Test::Methods
でrspecを使用する
header 'X_YOUR_HEADER_VAR', 'val'
get '/path'
ヘッダー変数はX-Your-Header-Var
として渡されます
ヘッダーを個別に設定する必要があります
request.headers["Accept"] = "application/json"
Get/delete/....経由で送信しようとすると、Rails4では完全なゴミになり、ヘッダーとしてではなくパラメーターとして送信されるため、頭が痛くなります。
{"Accept" => "application/json"}
RSpec 3では、次の構文を使用できます
get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }
Rspecの公式ドキュメントに記載 (v3.7へのリンク)
xhr: true
とヘッダーの両方を送信するには、たとえば:
my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
次のようなものを試してください:
get :index, :format => 'json'
あなたの質問は既に回答されていますが、別のアクションにPOSTしたい場合は、これをしなければなりません:
post :save, {format: :json, application: {param1: "test", param2: "test"}}