如何在RSpec测试中为JSON API传递身份验证令牌?

tim*_*xyz 2 json ruby-on-rails rspec-rails

我正在尝试get在Rails中向RSpec JSON API测试添加授权令牌.但到目前为止所尝试的一切都会导致错误.问题似乎是令牌未在请求中正确传递.

expected the response to have a success status code (2xx) but it was 401
Run Code Online (Sandbox Code Playgroud)

当前代码:

Project_spec.rb(测试)

before do
    @project = create(:project, :key => "123")
    get '/api/v1/projects/1', {:Authorization => "Token 123"}, format: :json
end

it "returns correct status" do
    expect( response ).to have_http_status(:success)
end
Run Code Online (Sandbox Code Playgroud)

ProjectsController.rb

before_filter :restrict_access, :except => :create

def show
    @project = Project.find(params[:id])
    render json: @project
end

def restrict_access
    authenticate_or_request_with_http_token do |token, options|
        Project.exists?(key: token)
    end
end
Run Code Online (Sandbox Code Playgroud)

根据网上发现的一些推荐解决方案,我试过了

  1. get '/api/v1/projects/1', format: :json, token: "123"

  2. get '/api/v1/projects/1', { 'HTTP-AUTHORIZATION' => 'Token "123"' }, format: :json

  3. get '/api/v1/projects/1', {:Authorization => "Token 123"}, format: :json

但似乎没有成功传递授权令牌.

注意:#3中的样式在从外部应用程序发布时起作用,但在RSpec测试本身中不起作用.

有没有人有这方面的经验,可以分享一些方向?

Зел*_*ный 8

使用它像:

 get '/api/v1/projects/1', {}, { Authorization:  "Token 123"}
Run Code Online (Sandbox Code Playgroud)

get是http方法,{}一个空的参数, { :Authorization => "Token 123"}标题

get(path,parameters = nil,headers_or_env = nil)

Documentation

另一种方式:

before do
    # some code here
    @request.env['Authorization'] = "Token 123"
    get '/api/v1/projects/1', format: :json
end
Run Code Online (Sandbox Code Playgroud)

  • 如果你省略它,那么`{授权:"令牌123"}`识别为params而不是标题. (2认同)

kan*_*kyu 6

当我像这样尝试时它起作用了

get '/api/v1/projects/1', as: :json, headers: {:Authorization => "Token 123"}
Run Code Online (Sandbox Code Playgroud)