2014-04-03 28 views
7

Làm cách nào để đặt tiêu đề yêu cầu trước khi thực hiện yêu cầu về thông số yêu cầu?Truy cập để yêu cầu đối tượng trong thông số kỹ thuật yêu cầu

Tôi đang di chuyển thông số bộ điều khiển để yêu cầu thông số kỹ thuật trên API của tôi bằng cách sử dụng Rails. Một điều tôi đang mắc kẹt là tôi không có quyền truy cập vào một đối tượng request để cho phép các yêu cầu.

On số kỹ thuật điều khiển của tôi, tôi có quyền truy cập đến một phương pháp tôi đã tạo mà ký một người dùng cụ thể:

def sign_in(user) 
    token = user.api_keys.first.token 
    # note the request object being used in the next line 
    request.env["HTTP_AUTHORIZATION"] = ActionController::HttpAuthentication::Token.encode_credentials(token) 
end 

này hoạt động tốt trên thông số kỹ thuật điều khiển, tôi có thể yên tâm làm:

before { sign_in(user) } 
it { post :endpoint, params } 

Nhưng theo yêu cầu, đối tượng request không khả dụng. Nếu tôi cố gắng:

before { sign_in(user) } 
it { post "/api/endpoint", params } 

tôi nhận được request trên phương pháp helper của tôi như nil.

Tôi biết tôi có thể làm:

it { post "/api/endpoint", {"HTTP_AUTHORIZATION" => ... } } 

Nhưng điều này dường như rất nhiều lộn xộn trong spec, đặc biệt so với một spec điều khiển.

Tôi đã thử sử dụng ActionDispatch::TestRequest::DEFAULT_ENV theo đề xuất của this answer nhưng cũng không hoạt động (tôi nhận được 401).

Trả lời

2

Nếu bạn chưa sử dụng Rack::Test cho điều này thì bạn nên làm như vậy. Rack::Test phù hợp hơn Capybara để kiểm tra các yêu cầu API. Nó có thể được cấu hình trong bạn rspec/spec_helper.rb

RSpec.configure do |config| 
    # ... 
    config.include Rack::Test::Methods 
end 

Khi bạn cấu hình để sử dụng rack :: Test, bạn có thể đặt tiêu đề trước khi yêu cầu như vậy:

it 'POST /api/enpoint authenticates successfully' do 
    header 'Authorization', '...' 
    post "/api/endpoint", params 
    expect(last_response).to be_ok 
end 

này sẽ có thể truy cập vào điều khiển của bạn là request.headers['HTTP_AUTHORIZATION'].

Mã nguồn của phương pháp này có thể được tìm thấy ở đây - https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb#L127-L141

+0

Tuyệt vời, cảm ơn bạn! –

+0

Điều này có được chỉ định trong tài liệu rspec ở bất kỳ đâu không? –

-1

Nếu bạn sử dụng capybara cho thông số kỹ thuật yêu cầu, tôi đoán bạn có thể đặt tiêu đề như đề xuất here, tuy nhiên tốt hơn nên thực hiện đăng nhập thực thông qua biểu mẫu HTML hoặc bất kỳ cách nào để xác thực trong ứng dụng của bạn cao hơn so với các bộ điều khiển, và đó là lý do tại sao họ thường không cho phép bạn đặt tiêu đề, cookie và các công cụ cấp thấp khác theo cách thủ công.

+0

Đây là một API, mà chỉ kết quả đầu ra JSON, không phải cái gì người dùng cuối được tương tác với. –

Các vấn đề liên quan