RSpec: проверка подлинности перед тестом с помощью devise_auth_token

Я использую devise_auth_token для аутентификации пользователей для API. Я хотел бы аутентифицировать пользователей перед каждым тестом, но продолжайте получать ошибку 401. Когда я использую postman для конечной точки с правильными заголовками, он работает, но не работает во время тестов.

before(:each) do
    @user = FactoryGirl.create(:user)
end

def get_auth
  headers = @user.create_new_auth_token
  auth = Hash.new
  auth["client"] = headers["client"]
  auth["access-token"] = headers["access-token"]
  auth["uid"] = headers["uid"]
  auth["expiry"] = headers["expiry"]
  return auth
end

it "auth user should return success" do
    get 'get_tasks_for_user', params: {uid: @user.uid}, headers: get_auth
    expect(response).to have_http_status(200)
end

RSpec

TasksController auth user should return success
     Failure/Error: expect(response).to have_http_status 200
       expected the response to have status code 200 but it was 401

1 ответ

  1. Можно использовать вспомогательный метод

    #/spec/support/helpers/session_helper.rb
    module SessionHelper
    
      def set_request_headers(resp)
        { 'ACCEPT' => "application/json",
          'Content-Type' => "application/json",
          'access-token' => resp['access-token'],
          'token-type' => resp['token-type'],
          'client' => resp['client'],
          'expiry' => resp['expiry'],
          'uid' => resp['uid']
        }
      end
    
      def subdomain_login(uid, password, subdomain)
        request_params = {
          'email' => uid,
          'password' => password
        }
        host! "#{subdomain}.lvh.me"
        post "/portal/auth/sign_in", params: request_params
        return set_request_headers(response.headers)
      end
    end
    

    Убедитесь, что у вас есть следующая запись в /spec/rails_helper

    Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
    RSpec.configure do |config|
     config.include SessionHelper, :type => :request
    end
    

    Вы можете использовать subdomain_loginв своих тестах. Вот пример Rspec.

    post '/portal/system/locations', params: request_params.to_json,
      headers: subdomain_login(user_id, password, subdomain)