2013-12-11 32 views
9

我正試圖寫出一個我的控制器的測試,它接受來自外部服務的請求。到目前爲止,這是我的測試:將標題附加到Rspec控制器測試

describe ApplyController do 
    context 'when valid' do 
    let(:parameters) do 
     file = File.join File.dirname(__FILE__), '..', 'samples', 'Indeed.json' 
     JSON.parse(File.read file) 
    end 
    let(:signature) { 'GC02UVj0d4bqa5peNFHdPQAZ2BI=' } 

    subject(:response) { post :indeed, parameters, 'X-Indeed-Signature' => signature } 

    it 'returns 200 ok if Request is valid' do 
     expect(response.status).to eq 200 
    end 
    end 
end 

這要根據documentation我可以find工作。

我的控制器現在看起來是這樣的:

class ApplyController < Application Controller 
    def indeed 
    binding.pry 
    end 
end 

當我進入撬在我的測試,並嘗試檢查request.headers['X-Indeed-Signature']的價值,我總是隻得到nil

有什麼事,我我錯過了?我使用Rails 3.2和RSpec 3

回答

7

我能解決它通過使用@request.env代替@request.headers像這樣:

describe ApplyController do 
    context 'when valid' do 
    let(:parameters) do 
     file = File.join File.dirname(__FILE__), '..', 'samples', 'Indeed.json' 
     JSON.parse(File.read file) 
    end 
    let(:signature) { 'GC02UVj0d4bqa5peNFHdPQAZ2BI=' } 

    it 'returns 200 ok if Request is valid' do 
     @request.env['X-Indeed-Signature'] = signature 
     post :indeed, parameters 
     expect(response.status).to eq 200 
    end 
    end 
end 
16

我想你想(直接從您的鏈接之一)

it "returns 200 ok" 
    @request.headers['X-Indeed-Signature'] = signature 
    post :indeed, parameters 
    response.status.should == 200 
end 

你不需要主題(:響應)

+2

事實證明,我實際上需要使用@ request.env ['X-Indeed-Signature']'而不是'@ request.headers' –

+7

它看起來像我需要'@ request.env' in Rails 3和Rails 4中的'@ request.headers'。 –

0

確定這是非常愚蠢的RSpec的。

自定義標題中請規格

headers = { 
    'AUTH' : 'super secret key' 
} 

post '/api/some_action', { user_id: 1337 }.to_json, headers 

而在你的控制器:在控制器規格

headers = { 
    'AUTH' : 'super secret key' 
} 

post '/api/some_action', { user_id: 1337 }, headers 

而在你的控制器

def some_action 
    token = request.headers['AUTH'] 
end 

自定義頁眉:

def some_action 
    token = request.headers['rack.session']['AUTH'] 
end 

只是分享了兩者之間的差異。我不相信我在rspec或rails中有任何特殊配置可以將兩種不同的spec類型的標題放在不同的位置。