2013-12-11 10 views
9

Ich versuche, Tests für einen Controller von mir zu schreiben, der Anfragen von externen Diensten aufnimmt. Bisher ist dies mein Test:Header an Rspec-Controller-Tests anfügen

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 

Dies sollte die documentation nach arbeite ich find konnte.

Mein Controller jetzt etwa wie folgt aussieht:

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

Als ich in Pry in meinem Test bekommen und versuchen, den Wert von request.headers['X-Indeed-Signature'] zu überprüfen, bekomme ich immer nur nil

Gibt es etwas, das ich vermisse ich? Ich bin mit Rails 3.2 und Rspec 3

Antwort

7

konnte ich beheben es durch @request.env statt @request.headers wie so mit:

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 
16

Ich glaube, Sie (gerade von einem Ihrer Links) wollen

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

Sie unterliegen nicht benötigen (: response)

+2

Es stellt sich heraus, dass ich tatsächlich '@ request.env ['X-Indeven-Signature']' anstelle von '@ request.headers' verwenden musste –

+7

Es sieht für mich aus, als ob Sie' @ request.env' in Rails brauchen 3 und '@ request.headers' in Rails 4. –

0

Ok das ist ziemlich dumm von rspec.

Benutzerdefinierte Header anfordern Specs

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

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

Und in Ihrem Controller:

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

Benutzerdefinierte Header in Controller-Specs

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

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

Und in Ihrem Controller:

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

Nur teilen die Unterschiede, die ich zwischen den beiden hatte. Ich glaube nicht, dass ich in rspec oder rails eine spezielle Konfiguration habe, um die Header der beiden unterschiedlichen Spezifikationstypen anders zu platzieren.