2010-09-12 4 views
7

Ich versuche, wie so die Session-Hash für einen Controller zu verspotten:rspec Schienen spöttischen Sitzung Hash

it "finds using the session[:company_id]" do 
    session.should_receive(:[]).with(:company_id).and_return 100 
    Company.should_receive(:find).with(100) 
    get 'show' 
end 

wenn ich 'Show' nennen es heißt:

received :[] with unexpected arguments 
expected: (:company_id) 
    got: ("flash") 

Der Controller-Code sieht aus wie:

def show 
    company_id = session[:company_id] 
    @company = Company.find params[company_id] 
end 

ich auch einfach haben versucht Einstellung

it "finds using the session[:company_id]" do 
    session[:company_id]= 100 
    Company.should_receive(:find).with(100) 
    get 'show' 
end 

dann aber ein Problem bekommen:

expected: (100) 
got: (nil) 

Wer Ideen warum?

+0

Hier ist meine Antwort auf diese Frage: http://stackoverflow.com/questions/8043956/rspec-2-7-access-controller-session-in-spec-before-making-request/13369734#13369734 –

Antwort

0

Dies liegt daran, dass Sie die Flash-Sitzung von Ihrem Controller abrufen. Also definiere es. Flash ist in der Sitzung gespeichert.

it "finds using the session[:company_id]" do 
    session.stub!(:[]).with(:flash) 
    session.should_receive(:[]).with(:company_id).and_return 100 
    Company.should_receive(:find).with(100) 
    get 'show' 
end 
+0

habe ich versucht, dies aber ich habe noch einen Fehler 1) CompanyController GET 'Show' findet mit der Sitzung erhalten [: company_id] Ausfall/Fehler: get 'show' nicht definierte Methode 'sweep‘ für nil: NilClass #/Benutzer /adam/.rvm/gems/ruby-1.8.7-p299/gems/activesupport-3.0.0/lib/active_support/whiny_nil.rb:48:in 'method_missing '... –

1

versuchen Sie dies:

session.expects(:[]).with(has_entries('company_id' => 100)) 
4

Ich lief in diese. Ich konnte es nicht schaffen, dass ich den Flash-Kram nicht stören sollte.

Aber lassen Sie mich das Verhalten testen ich suchte:

it "should redirect to intended_url if set" do 
    request.env['warden'] = double(:authenticate! => true) 
    session.stub(:[]).with("flash").and_return double(:sweep => true, :update => true, :[]= => []) 
    session.stub(:[]).with(:intended_url).and_return("/users") 
    post 'create' 
    response.should redirect_to("/users") 
end 

Hoffnung, das hilft ...

2

Ich konnte nicht herausfinden, wie die Sitzung Behälter verspotten sich jedoch in den meisten Fällen einfach Sitzungsdaten mit Anfrage zu übergeben sollte ausreichen. So würde der Test in zwei Fälle aufgeteilt:

it "returns 404 if company_id is not in session" do 
    get :show, {}, {} 
    response.status.should == 404 # or assert_raises depending on how you handle 404s 
end 

it "finds using the session[:company_id]" do 
    Company.should_receive(:find).with(100) 
    get :show, {}, {:company_id => 100} 
end 

PS: vergessen zu erwähnen, die ich von this snippet einige individuelle Helfer bin mit.