如何在具有RSpec的RESTful API中测试使用令牌认证的Rails devise登录?

时间:2018-12-17 17:14:23

标签: ruby-on-rails rspec devise ruby-on-rails-5

我使用Ruby on Rails构建了RESTful API,现在只允许经过身份验证的用户发出请求。因此,我实现了一个ApiController:

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

我使用一个React客户端,该客户端随每个请求发送所需的auth标头。到目前为止一切都很好。只是我在请求规范中模拟登录时遇到问题。

从理论上讲,我将创建一个用户并登录。但是如何将令牌与请求一起发送?

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 :(得分:1)

不确定,但是一种解决方法是登录用户,然后将auth令牌添加到标头参数中。

Module AuthSpecHelper
  def auth_spec_request(user)
    request.headers.merge!(user.create_new_auth_token) if sign_in(user)
  end
end

答案 1 :(得分:1)

我在Devise Wiki:How To: sign in and out a user in Request type specs (specs tagged with type: :request)

上找到了它
  

...但是更简单的方法是:

     

spec / rails_helper.rb

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

只需在您的请求规范中使用sign_in

     

这等效于在系统/功能规格或Rails系统/控制器测试中声明include Devise::Test::IntegrationHelpers

答案 2 :(得分:0)

您可以将标头添加到get请求中,如下所示:

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

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