2014-04-03 99 views
7

如何在請求規範請求之前設置請求頭?訪問請求規範中的請求對象

我正在移動控制器規格以使用Rails在我的API上請求規範。我堅持的一件事是,我無法訪問request對象來允許請求。

在我的控制器的規格,我有機會到我創建了一個方法,它標誌一個特定的用戶:

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 

這部作品控制器規格很好,我可以放心地做:

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

但在請求規範中,request對象不可用。 如果我嘗試:

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

我得到request上幫助我的方法nil

我知道我可以做的:

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

但這似乎很多雜亂的規範,特別是相對於控制器規範。

我試過使用ActionDispatch::TestRequest::DEFAULT_ENV建議this answer,但它也沒有工作(我得到401)。

回答

2

如果你還沒有使用Rack::Test爲此,那麼你應該。 Rack::Test比Capybara更適合測試API請求。它可以在配置了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 

這將是你的控制器訪問作爲request.headers['HTTP_AUTHORIZATION']

此方法的源代碼可以在這裏找到 - https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb#L127-L141

+0

太好了,謝謝! –

+0

這是在rspec文檔中的任何地方指定的? –

-1

如果您對請求規格使用水豚,我想您可以像建議的here一樣設置標頭,但是最好通過HTML表單執行真正的登錄或者在您的應用中進行身份驗證的方式,因爲請求規格比控制器更高級別,這就是爲什麼他們通常不允許你手動設置標題,cookie和其他低級別的東西。

+0

這是一個API,其中僅輸出JSON,不是最終用戶與之交互。 –