如何使用 RSpec 在 RESTful API 中使用令牌身份验证来测试 Rails 设计登录?

Ste*_*ven 5 rspec ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

我使用一个 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
Run Code Online (Sandbox Code Playgroud)

请求的关键部分是请求cookie:

authHeaders {
  "access-token":"sMKTl2Zx_8S5f12ydhSaPw",
  "token-type":"Bearer",
  "client":"rzarzdBXCv2SsS9XvYMLVA",
  "expiry":"1546427742",
  "uid":"104006675969015609263"
}
Run Code Online (Sandbox Code Playgroud)

它与请求一起发送。

ari*_*ver 0

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

get 'path', params: {...}, headers: {...}
Run Code Online (Sandbox Code Playgroud)

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