Pet*_*own 15 rspec ruby-on-rails ruby-on-rails-3
我有两个RSpec测试,一个控制器规范和一个请求规范,我正在向同一个控制器的索引操作发出GET请求.在这两个规范中,我发送一个包含Oauth2承载令牌的Authorization标头.
我遇到的问题是,根据规范的类型,标头存储在请求对象的不同属性上.对于请求规范,它request.env["Authorization"]在控制器规范的情况下是可用的,它可以在request.session["Authorization"].
为什么"授权"存储在不同类型的规格的不同位置?有什么地方我可以找到两个规格吗?
这个bearer_token方法在父控制器类中,我从头部抓取令牌:
与env请求规范一起使用:
def bearer_token
pattern = /^Bearer /
header = request.env["Authorization"] # <= env
header.gsub(pattern, '') if header && header.match(pattern)
end
Run Code Online (Sandbox Code Playgroud)
与session控制器规格一起使用:
def bearer_token
pattern = /^Bearer /
header = request.session["Authorization"] # <= session
header.gsub(pattern, '') if header && header.match(pattern)
end
Run Code Online (Sandbox Code Playgroud)
这是我的要求规范:
describe '' do
let(:user) { Fabricate(:user) }
describe 'accessing content with valid token' do
let(:token) { OauthToken.create(user: user) }
let(:auth_headers) { {
'Authorization' => "Bearer #{token.access_token}",
'HTTPS' => 'on'
} }
before { get api_v2_cats_path, {}, auth_headers }
specify { response.status.should == 200 }
end
end
Run Code Online (Sandbox Code Playgroud)
这是我的控制器规格
describe Api::V2::CatsController do
let(:user) { Fabricate(:user) }
describe ".index" do
let(:token) { OauthToken.create(user: user) }
let(:auth_headers) { {
'Authorization' => "Bearer #{token.access_token}",
'HTTPS' => 'on'
} }
it "should be valid" do
get :index, { format: :json, page_size: 1 }, auth_headers
@json = JSON.parse(response.body)
@json.should_not be_nil
end
end
end
Run Code Online (Sandbox Code Playgroud)
Pet*_*own 14
我假设API与get请求和控制器规范之间的方法相同.在控制器规范中,第三个参数是会话变量的散列,而不是标头变量.您可以直接在@request对象上设置标题,如下所示:
describe Api::V2::CatsController do
let(:user) { Fabricate(:user) }
describe ".index" do
let(:token) { OauthToken.create(user: user) }
let(:auth_headers) { {
'Authorization' => "Bearer #{token.access_token}",
'HTTPS' => 'on'
} }
before do
@request.env.merge!(auth_headers)
end
it "should be valid" do
get :index, { format: :json, page_size: 1 }
@json = JSON.parse(response.body)
@json.should_not be_nil
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后获取授权标头的正确方法是使用:
def bearer_token
pattern = /^Bearer /
header = request.env["Authorization"] # <= env
header.gsub(pattern, '') if header && header.match(pattern)
end
Run Code Online (Sandbox Code Playgroud)
我找到了这个。
在您的控制器中,您可以执行类似操作来获取标头值。
def index
header_value = request.authorization
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6452 次 |
| 最近记录: |