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

时间:2013-12-11 21:06:26

标签: ruby-on-rails ruby ruby-on-rails-3 rspec rspec-rails

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

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

这应该符合我documentation find的{{3}}。

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

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

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

我有什么遗失的东西吗?我正在使用Rails 3.2和Rspec 3

4 个答案:

答案 0 :(得分:20)

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

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

您不需要主题(:回复)

答案 1 :(得分:8)

我可以使用@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 :(得分:0)

好的,这对于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中有任何特殊配置可以使用两种不同的规格类型。标题放置方式不同。

答案 3 :(得分:0)

我在使用 rubocop 时遇到了很多问题来避免它,我需要将标题放入 let 中。另外调用request.headers.merge!而不是@request.headers['key']=value。

我从 here 那里得到了修复:

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(:headers) do
      {
        signature: 'GC02UVj0d4bqa5peNFHdPQAZ2BI='
      } 

    it 'returns 200 ok if Request is valid' do
      request.headers.merge! headers
      post :indeed, parameters
      expect(response.status).to eq 200
    end
  end
end