2010-09-12 6 views
7

Je suis en train de se moquer de la hachage de session pour un contrôleur comme ceci:rails rspec moqueurs hash session

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 

Quand j'appelle get 'show' il déclare:

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

Le code du contrôleur ressemble à:

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

J'ai simplement essayé de placer

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

mais obtenir un problème sur:

expected: (100) 
got: (nil) 

Quelqu'un a des idées pourquoi?

+0

Voici ma réponse à cette question: http://stackoverflow.com/questions/8043956/rspec-2-7-access-controller-session-in-spec-before-making-request/13369734#13369734 –

Répondre

0

C'est parce que vous récupérez une session flash à partir de votre contrôleur. Alors, définissez-le. Flash est enregistrer en session.

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

J'ai essayé cela, mais je reçois toujours une erreur 1) CompanyController GET 'show' trouve en utilisant la session [: company_id] Panne/erreur: get 'show' méthode non définie de balayage » pour nul: NilClass #/utilisateurs /adam/.rvm/gems/ruby-1.8.7-p299/gems/activesupport-3.0.0/lib/active_support/whiny_nil.rb:48:in 'method_missing '... –

1

essayez ceci:

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

Je viens de croiser cela. Je n'ai pas réussi à obtenir should_receive pour ne pas interférer avec le flash.

Mais cela me permettra de tester le comportement que je cherchais:

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 

espoir qui aide ...

2

Je ne pouvais pas comprendre comment se moquer du conteneur de session elle-même, mais dans la plupart des cas le simple fait de transmettre des données de session avec une requête devrait suffire. Ainsi, le test serait divisé en deux cas:

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: oublié de mentionner que je utilise des aides personnalisées à partir this snippet.