将标头附加到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 

这应该根据我能找到的文档工作。

我的控制器现在看起来像这样:

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

当我在测试中进入Pry并尝试检查request.headers['X-Indeed-Signature']的值时,我总是得到nil

有什么东西我不见了吗? 我正在使用Rails 3.2和Rspec 3

我想你想要(直接来自你的一个链接)

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

你不需要主题(:回复)

我能够通过使用@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 

好吧,这对于rspec来说非常愚蠢。

请求规范中的自定义标头

 headers = { 'AUTH' : 'super secret key' } post '/api/some_action', { user_id: 1337 }.to_json, headers 

在你的控制器中:

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

Controller规范中的自定义标头

 headers = { 'AUTH' : 'super secret key' } post '/api/some_action', { user_id: 1337 }, headers 

在你的控制器中:

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

只是分享两者之间的差异。 我不相信我在rspec或rails中有任何特殊配置,以使两种不同规范类型的标题以不同方式放置。