我正在尝试为我的控制器编写测试,以接收来自外部服务的请求。到目前为止,这是我的测试:
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
答案 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