问题
I'm trying to write out tests for a controller of mine that takes in requests from external services. So far this is my test:
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
This should work according to the documentation I could find.
My controller right now looks something like this:
class ApplyController < Application Controller
def indeed
binding.pry
end
end
When I get into Pry in my test and try to check the value of request.headers['X-Indeed-Signature']
I always just get nil
Is there something that I am missing? I am using Rails 3.2 and Rspec 3
回答1:
I think you want (straight from one of your links)
it "returns 200 ok"
@request.headers['X-Indeed-Signature'] = signature
post :indeed, parameters
response.status.should == 200
end
You don't need subject(:response)
回答2:
I was able to fix it by using @request.env
instead of @request.headers
like so:
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
回答3:
Ok this is pretty silly of rspec.
Custom headers in Request Specs
headers = {
'AUTH' => 'super secret key'
}
post '/api/some_action', { user_id: 1337 }.to_json, headers
And in your controller:
def some_action
token = request.headers['AUTH']
end
Custom headers in Controller Specs
headers = {
'AUTH' => 'super secret key'
}
post '/api/some_action', { user_id: 1337 }, headers
And in your controller:
def some_action
token = request.headers['rack.session']['AUTH']
end
Just sharing the differences I had between the two. I don't believe I have any special configuration in rspec or rails to have the two different spec types' headers to be placed differently.
来源:https://stackoverflow.com/questions/20529917/appending-headers-to-rspec-controller-tests