2014-04-03 16 views
7

İstek başlıklarında istekte bulunmadan önce istek başlıklarını nasıl ayarlayabilirim?İstek özelliklerinde isteklerinize göre detaylandırılır Özellikler

Rails kullanarak API'mda özellik istemek için denetleyici özelliklerine geçiyorum. Sıkıştığım bir şey, isteklere izin vermek için request nesnesine erişimim olmamasıdır.

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 

Bu güvenle yapabilirsiniz denetleyici özellikleri üzerinde çalışıyor: Benim denetleyicisi özellikleri üzerinde

, ben belirli bir kullanıcıyı imzalar benim yarattığım bir yöntem erişebilir

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

Ama Bir istek belirtildiğinde, request nesnesi mevcut değildir. Ben denerseniz :

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

Ben nil olarak benim yardımcı yöntemine request olsun.

Yapabileceğim biliyorum:

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

Ama bu özel bir kontrolör spec kıyasla spec içinde karmakarışık bir sürü gibi görünüyor.

ActionDispatch::TestRequest::DEFAULT_ENV kullanımını this answer tarafından önerilen şekilde denedim, ancak işe yaramadı (401 aldım).

cevap

2

Şimdilik Rack::Test kullanmıyorsanız, o zaman olmalısınız. API isteklerini test etmek için Rack::Test Capybara'dan daha uygundur. Bu yapılandırılabilir senin sen, istek şöyle önce başlıklarını ayarlayabilirsiniz Raf :: Testi kullanmak üzere yapılandırılmış ediyoruz rspec/spec_helper.rb

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

:

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

Bu denetleyici erişilebilir olacaktır request.headers['HTTP_AUTHORIZATION'].

Bu yöntem için kaynak kodu burada bulunabilir - https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb#L127-L141

+0

Harika, teşekkürler! –

+0

Bu, rspec belgelerinde herhangi bir yerde belirtilmiş midir? –

-1

Talep şartnameleri için capybara kullanırsanız, önerilen üstbilgileri here gibi ayarlayabileceğinizi tahmin etmeliyiz, ancak HTML formunda gerçek oturum açma işlemini gerçekleştirmek veya uygulamada kimlik doğrulamanın yolu nedir? denetleyicilerinkinden daha yüksek düzeydedir ve bu nedenle normal olarak üstbilgileri, çerezleri ve diğer düşük düzeydeki öğeleri el ile ayarlamanıza izin vermez.

+0

Bu yalnızca JSON, son kullanıcı ile etkileşim değil bir yanıt versin bir API vardır. –

İlgili konular