我使用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"
}
它与请求一起发送。
答案 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