2010-09-12 13 views
7

estoy tratando de burlar a cabo el hash sesión para un controlador de este modo:rieles rspec burlones sesión de 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 

Cuando llamo get 'show' se afirma:

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

El código del controlador Aspecto del producto:

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

también he intentado fijar simplemente

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

pero a continuación, obtener una cuestión acerca de:

expected: (100) 
got: (nil) 

Alguien tiene idea de por qué?

+0

aquí está mi respuesta a esta pregunta: http://stackoverflow.com/questions/8043956/rspec-2-7-access-controller-session-in-spec-before-making-request/13369734#13369734 –

Respuesta

0

Esto se debe a que obtiene la sesión de flash desde su controlador. Así que defínalo. Flash es guardar en sesión.

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

he intentado esto, pero aún así obtener un error 1) CompanyController GET 'show' se encuentra utilizando la sesión [: company_id] Fallo/error: get 'show' método no definido 'barrido' para nada: NilClass #/Usuarios /adam/.rvm/gems/ruby-1.8.7-p299/gems/activesupport-3.0.0/lib/active_support/whiny_nil.rb:48:in 'method_missing '... –

1

probar esto:

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

Me acabo de encontrar con esto. No pude lograr que should_receive no interfiriera con el flash.

Pero esto me dejó probar el comportamiento que estaba buscando:

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 

Espero que ayude ...

2

no podía encontrar la manera de burlarse del contenedor sesión de sí mismo, sin embargo, en la mayoría de los casos simplemente pasar los datos de la sesión con la solicitud debería ser suficiente. Por lo que la prueba se divide en dos casos:

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: se olvidó de mencionar que estoy usando algunos ayudantes personalizadas desde this snippet.

Cuestiones relacionadas