12

私が構築しているAPIの一部として、成功すると、有用なユーザー情報、APIトークンなどのペイロードを返すユーザー認証メソッドがあります。

これを処理するコントローラーの機能テストを作成する際に、HTTP基本認証のテストで問題が発生しました。認証を試みるためにヘッダーをスプーフィングするために次のコードを使用する必要があると述べているブログを多数見つけました。

@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(email, pass)

問題は、これは効果がないということです。authenticate_with_http_basicはヘッダーを認識しないため、有効なクレデンシャルが存在する場合でもfalseを返します。

私は何かが足りないのですか?

回答に役立つ場合、アプリはRails2.2.2にフリーズされることに注意してください。

4

1 に答える 1

9

これが役立つかどうかはわかりませんが、Rails 2.3.2を使用している場合を除いて、自分のアプリケーションでこれらのテストの1つを実行しました。

私の場合、落とし穴は、ユーザー用のフィクスチャを入れるのを忘れていたため、crypted_pa​​sswordが一致しなかったということでした(なぜそれがまったく値を持っていたのかはまだ私には謎です...私はRailsがきれいにならなかったと思いますテストを実行する前にテストデータベース?)

class DonglesControllerTest < ActionController::TestCase
  fixtures :users

  test "index api" do
    @request.env['HTTP_AUTHORIZATION'] = encode_credentials('one', 'one')

    get(:index, { :name_contains => 'XXXX0001', :format => 'json' })

    assert_equal 'application/json', @response.content_type
    dongles = ActiveResource::Formats::JsonFormat.decode(@response.body)

    expected_dongles = [
      { 'id' => 1,
        'name' => 'XXXX0001',
        'key_id' => 'usbstor\disk&ven_flash&prod_drive_sm_usb20&rev_1100\0000000000000000&0' }
    ]

    assert_equal expected_dongles, dongles
  end

  private

  # verbatim, from ActiveController's own unit tests
  def encode_credentials(username, password)
    "Basic #{ActiveSupport::Base64.encode64("#{username}:#{password}")}"
  end
end
于 2009-08-11T01:21:52.907 に答える