20

before フィルターで http トークン認証を使用しているコントローラーをテストしようとしています。私の問題は、トークンを渡すためにcurlを使用しても問題なく動作することですが、私のテストでは常に失敗します(私はrspec btwを使用しています)。トークンが渡されているかどうかを確認する簡単なテストを試みましたが、渡されていないようです。テストで実際にトークンをコントローラーに渡すために何か不足していますか?

これが私の前のフィルターです:

    def restrict_access
      authenticate_or_request_with_http_token do |token, options|
        api_key = ApiKey.find_by_access_token(token)
        @user = api_key.user unless api_key.nil?
        @token = token #set just for the sake of testing
        !api_key.nil?
      end 
    end

そして、ここに私のテストがあります:

    it "passes the token" do
      get :new, nil,
        :authorization => ActionController::HttpAuthentication::Token.encode_credentials("test_access1")

      assigns(:token).should be "test_access1"
    end
4

1 に答える 1

29

ApiKey は ActiveRecord モデルだと思いますよね?curl コマンドは開発データベースに対して実行され、テストはテスト データベースに対して実行されます。スニペットに ApiKey を設定するものは何も表示されません。他の場所にない限り、次の行に沿って何かを追加してみてください。

it "passes the token" do
  # use factory or just create record with AR:
  ApiKey.create!(:access_token => 'test_access1', ... rest of required attributes ...)

  # this part remains unchanged
  get :new, nil,
    :authorization => ActionController::HttpAuthentication::Token.encode_credentials("test_access1")

  assigns(:token).should be "test_access1"
end

before :each後でブロックまたはサポート モジュールに移動できます。

アップデート:

あなたのコメントを見て、私はもっと深く見なければなりませんでした。これが別の推測です。この形式のget

get '/path', nil, :authorization => 'string'

統合テストでのみ機能するはずです。コントローラーのテストでは、認証の準備は次のようになります。

it "passes the token" do
  request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Token.encode_credentials("test_access1")
  get :new
  assigns(:token).should be "test_access1"
end

この背後にある理由は、それぞれのテスト モジュールのメソッド シグネチャに由来します。

# for action_controller/test_case.rb
def get(action, parameters = nil, session = nil, flash = nil)

# for action_dispatch/testing/integration.rb
def get(path, parameters = nil, headers = nil)
于 2012-08-20T18:38:44.480 に答える