web-dev-qa-db-ja.com

RSpecを介したカスタムヘッダーの送信

私のAPIを考えると、コンシューマーは次のような顧客HTTPヘッダーを送信する必要があります。

# curl -H 'X-SomeHeader: 123' http://127.0.0.1:3000/api/api_call.json

次に、次のようなbefore_filterメソッドでこのヘッダーを読み取ることができます。

# app/controllers/api_controller.rb
class ApiController < ApplicationController
    before_filter :log_request

private
    def log_request
        logger.debug "Header: #{request.env['HTTP_X_SOMEHEADER']}"
        ...
    end
end

これまでのところ素晴らしい。動作に変更があるので、RSpecを使用してこれをテストしたいと思います。

# spec/controllers/api_controller_spec.rb
describe ApiController do
    it "should process the header" do
        @request.env['HTTP_X_SOMEHEADER'] = '123'
        get :api_call
        ...
    end
end

ただし、ApiControllerで受信したrequestは、ヘッダー変数を見つけることができません。

HTTP_ACCEPT_LANGUAGEヘッダーを使用してsame codeを試行すると、機能します。カスタムヘッダーはどこかでフィルタリングされていますか?

PS:Webのいくつかの例では、@requestの代わりにrequestを使用しています。現在のRails 3.2/RSpec 2.14の組み合わせの時点でどちらが正しいかはわかりませんが、どちらの方法も正しい動作をトリガーしませんが、どちらもHTTP_ACCEPT_LANGUAGEでも機能します。

20
Sebastian Roth

まあ、多分人々には遅すぎますが、ただ並んでいるだけです:

it 'should get profile when authorized' do
  user = FactoryGirl.create :user
  request.headers[EMAIL_TOKEN] = user.email
  request.headers[AUTH_TOKEN] = user.authentication_token
  get :profile
  response.should be success
end

適切な設定でrequest.headersを呼び出すだけです。

24
alexey_the_cat

getで直接定義できます。

get :api_call, nil, {'HTTP_FOO'=>'BAR'}

コンソールで動作することを確認しました。

12
Billy Chan

RSpecリクエストの仕様 Rails 5 に変更されたため、カスタムheadersparamsはキー値ハッシュ引数を使用して定義する必要があります。例えば:

前にRails 4

it "creates a Widget and redirects to the Widget's page" do
  headers = { "CONTENT_TYPE" => "application/json" }
  post "/widgets", '{ "widget": { "name":"My Widget" } }', headers
  expect(response).to redirect_to(assigns(:widget))
end

今度はRails 5:

it "creates a Widget and redirects to the Widget's page" do
  headers = { "CONTENT_TYPE" => "application/json" }
  post "/widgets", :params => '{ "widget": { "name":"My Widget" } }', :headers => headers
  expect(response).to redirect_to(assigns(:widget))
end
5
Kelsey Hannan