将标头附加到Rspec控制器测试

Dav*_*ong 12 ruby rspec ruby-on-rails rspec-rails ruby-on-rails-3

我正在尝试为我的控制器编写测试,以接收来自外部服务的请求.到目前为止,这是我的测试:

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
Run Code Online (Sandbox Code Playgroud)

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

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

class ApplyController < Application Controller
  def indeed
    binding.pry
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*gle 21

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

it "returns 200 ok"
  @request.headers['X-Indeed-Signature'] = signature
  post :indeed, parameters
  response.status.should == 200
end
Run Code Online (Sandbox Code Playgroud)

你不需要主题(:回应)

  • 在我看来,你需要在Rails 3中使用`@ request.env`和在Rails 4中使用`@ request.headers`. (7认同)
  • 事实证明我实际上需要使用`@ request.env ['X-Indeed-Signature']`而不是`@ request.headers` (2认同)

Dav*_*ong 10

我能够通过使用@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
Run Code Online (Sandbox Code Playgroud)