Подтвердить что ты не робот

RoR: тестирование действия, использующего аутентификацию через токен

Я пытаюсь протестировать контроллер, использующий аутентификацию с помощью токена http в переднем фильтре. Моя проблема в том, что он работает нормально, потому что я использую curl для передачи токена, но в моих тестах он всегда терпит неудачу (я использую rspec btw). Пробовал простой тест, чтобы проверить, прошел ли токен вообще, но похоже, что он этого не делает. Я что-то упустил, чтобы проверить, действительно ли передается токен контроллеру?

Здесь my before filter:

    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
4b9b3361

Ответ 1

Я предполагаю, что ApiKey - это модель ActiveRecord, правильно? curl запускается против базы данных разработки, а тесты идут против теста db. Я не вижу ничего, что устанавливает 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 или модуль поддержки.

UPDATE:

После просмотра вашего комментария мне пришлось смотреть глубже. Вот еще одна догадка. Эта форма get

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

должен работать только в тестах интеграции. А для контрольных тестов подготовка auth должна выглядеть так:

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)