Как протестировать Rails для входа в систему с авторизацией токена в RESTful API с RSpec? - PullRequest
0 голосов
/ 17 декабря 2018

Я создал RESTful API с использованием Ruby on Rails, и теперь я только позволяю аутентифицированным пользователям делать запросы.Поэтому я реализовал ApiController:

class ApiController < ApplicationController
  include DeviseTokenAuth::Concerns::SetUserByToken
  before_action :authenticate_api_v1_user!
end

Я использую клиент React, который отправляет требуемые заголовки аутентификации при каждом запросе.Пока все работает хорошо.Только из-за того, что у меня есть проблемы с имитацией входа в спецификации моего запроса.

Теоретически, я бы создал пользователя и зарегистрировал его. Но как мне отправить токен вместе с запросом?

describe 'Items API', type: :request do
  # initialize test data
  let!(:user) { create(:user) }
  let!(:items) { create_list(:item, 10) }

  # Test suite for GET /api/v1/items
  describe 'GET /api/v1/items' do
    # make HTTP get request before each example
    before { get '/api/v1/items' }

    it 'returns items' do
      expect(json).not_to be_empty
      expect(json.size).to eq(10)
    end

    it 'returns status code 200' do
      expect(response).to have_http_status(200)
    end
  end

  ...

end

Важной частью запроса является cookie-файл запроса:

authHeaders {
  "access-token":"sMKTl2Zx_8S5f12ydhSaPw",
  "token-type":"Bearer",
  "client":"rzarzdBXCv2SsS9XvYMLVA",
  "expiry":"1546427742",
  "uid":"104006675969015609263"
}

Он отправляется вместе с запросом.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Не уверен, но одним из обходных путей может быть вход пользователя в систему и добавление токена авторизации в параметры заголовка.

Module AuthSpecHelper
  def auth_spec_request(user)
    request.headers.merge!(user.create_new_auth_token) if sign_in(user)
  end
end
0 голосов
/ 24 декабря 2018

Я нашел это в вики Devise: Как: войти в систему и выйти из нее в спецификации типа запроса (спецификации, помеченные типом:: запрос)

... но более простой подход заключается в следующем:

spec / rails_helper.rb

RSpec.configure do |config|
  # ...
  config.include Devise::Test::IntegrationHelpers, type: :request
end

И просто используйте sign_in в спецификации запроса.

Это эквивалентно объявлению include Devise::Test::IntegrationHelpers в спецификации системы / функции или тесте системы / контроллера Rails.

0 голосов
/ 17 декабря 2018

Вы можете добавить заголовки к запросу get, например:

get 'path', params: {...}, headers: {...}

https://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

...