Appending headers to Rspec controller tests

◇◆丶佛笑我妖孽 提交于 2020-01-22 09:25:40

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!