Добавление заголовков в тесты контроллера 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

Ответ 1

Мне удалось исправить его, используя @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

Ответ 2

Я думаю, что вы хотите (прямо из одной из ваших ссылок)

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

Вам не нужна тема (: ответ)

Ответ 3

Хорошо, это довольно глупо из rspec.

Пользовательские заголовки в спецификации запроса

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

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

И в вашем контроллере:

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

Пользовательские заголовки в спецификации контроллера

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, чтобы заголовки двух разных типов спецификаций располагались по-разному.