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

问题描述 投票:11回答: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

这应该根据我可以documentationfind工作。

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

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

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

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

ruby-on-rails ruby ruby-on-rails-3 rspec rspec-rails
3个回答
20
投票

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

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

你不需要主题(:回应)


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

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

Controller规范中的自定义标头

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

© www.soinside.com 2019 - 2024. All rights reserved.