Интеграционное тестирование Rails API с базовой аутентификацией - PullRequest
3 голосов
/ 12 августа 2010

Я пытаюсь получить тестовый вход с использованием обычной аутентификации. Я попробовал несколько подходов. См. Код ниже для списка неудачных попыток и кода. Есть ли что-то очевидное, что я делаю неправильно? Спасибо

class ClientApiTest < ActionController::IntegrationTest
  fixtures :all

  test "adding an entry" do

    # No access to @request
    #@request.env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("someone@somemail.com:qwerty123")

    # Not sure why this didn't work
    #session["warden.user.user.key"] = [User, 1]

    # This didn't work either
    # url = URI.parse("http://localhost.co.uk/diary/people/1/entries.xml")
    # req = Net::HTTP::Post.new(url.path)
    # req.basic_auth 'someone@somemail.com', 'qwerty123'

    post "/diary/people/1/entries.xml", {:diary_entry => {
                                              :drink_product_id => 4,
                                              :drink_amount_id => 1,
                                              :quantity => 3
                                             },
                                        }
    puts response.body
    assert_response 200
  end
end

Ответы [ 2 ]

6 голосов
/ 12 августа 2010

Похоже, вы используете rails3 - Rails3 переключился на Rack :: test, поэтому синтаксис другой. Вы передаете хеш среды для установки переменных вашего запроса, таких как заголовки.

Попробуйте что-то вроде:

path = "/diary/people/1/entries.xml"
params = {:diary_entry => {
    :drink_product_id => 4,
    :drink_amount_id => 1,
    :quantity => 3}

env=Hash.new
env["CONTENT_TYPE"] = "application/json"
env["ACCEPT"] = "application/json"
env["HTTP_AUTHORIZATION"] = "Basic " + Base64::encode64("someone@somemail.com:qwerty123")

get(end_point, params, env)

Это тоже может сработать, но это может быть только синатрой:

get '/protected', {}, {'HTTP_AUTHORIZATION' => encode_credentials('go', 'away')}

Sinatra test credit

4 голосов
/ 12 июля 2012

Это работает для меня в Rails 3

@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials('username', 'password')
get :index
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...