Тестирование http Basic Auth в Rails 2.2+
в рамках API, который я создаю, есть метод аутентификации пользователя,который после успеха возвращает полезную нагрузку полезной информации пользователя, маркер API и т. д.
при написании функциональных тестов для контроллера, который обрабатывает это, я бегу к проблеме тестирования http Basic auth; я нашел множество блогов, в которых упоминается следующий код, который должен использоваться для подделки заголовков для попытки аутентификации:
@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(email, pass)
вопрос в том, что это не имеет никакого эффекта; authenticate_with_http_basic
не видит заголовки и поэтому возвращает false даже при наличии действительных учетных данных.
Я что-то пропустила?
обратите внимание, что приложение заморожено в Rails 2.2.2, если это полезно при ответе.
1 ответов
Я не уверен, что это помогает, Но я только что сделал один из этих тестов в своем собственном приложении, за исключением того, что я использую Rails 2.3.2.
в моем случае ловушка заключалась в том, что я забыл поставить светильники для пользователей, поэтому crypted_password не совпадал (почему он вообще имел какое-либо значение, до сих пор остается для меня загадкой... Я думаю, 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_110000000000000000&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