2012-01-12 6 views
5

Me pregunto cómo validar los locales pasaron a prestar plantilla en el controladorCómo validar los locales de rendir plantilla en rspec

controlador:

def lelf_panel 
    # ... 
    if some_condition 
    locals_hash = some_very_long_hash_A 
    else 
    locals_hash = some_very_long_hash_B 
    end 
    render :partial => "left_panel", :layout => false, :locals => locals_hash 
end 

Spec actual:

it 'should render correct template for lelf_panel' do 
    # ... 
    get 'left_panel' 
    response.should render_template('system/_left_panel') 
end 

Ahora Necesito terminar Rcov para este controlador así que necesito agregar/modificar la especificación para cubrir ambos resultados de 'some_condition'. y quiero validar los locales 'lelf_panel' pasados ​​a renderizar, como si solo validara el render_template, la página parcial renderizada para ambos resultados es la misma.

puedo comprobar el 'render_template' en documentos rspec en http://rubydoc.info/gems/rspec-rails/2.8.1/RSpec/Rails/Matchers/RenderTemplate:render_template

sólo proporciono y 2º params de mensaje, así que ¿cómo puedo probar los locales pasaron a prestar?

Respuesta

1

hasta donde yo sé, no hay forma de examinar directamente a los lugareños para una plantilla en la forma que está describiendo.

Puede cambiar locals_hash por @locals_hash y luego examinar los resultados mediante asignaciones (: locals_hash).

O bien, puede usar selectores en el HTML resultante y verificar que haya algún contenido indicativo; por ejemplo, si locals_hash afecta el título de la página, verifique que el título de la página HTML resultante sea el esperado.

14

En lugar de utilizar el emparejador render_template, puede usar una expectativa sobre el objeto del controlador.

it 'should render correct template for lefl_panel' do 
    # ... 
    allow(controller).to receive(:render).with no_args 
    expect(controller).to receive(:render).with({ 
    :partial => 'system/_left_panel', 
    :layout => false, 
    :locals => some_very_long_hash_A 
    }) 
    get 'left_panel' 
end 
+0

Esto funcionó para mí - pero sólo después de poner el comando get DESPUÉS del comentario should_receive, y también necesitaba agregar controller.stub (: render) para evitar un error, pero no estoy seguro de por qué ... – Phantomwhale

+1

Esta es la respuesta superior. Cambiar una aplicación para que se ajuste a las necesidades de una biblioteca de prueba es un olor a código. – user94154

+0

@Phantomwhale Acabo de golpear el mismo error que encontraste. El problema es que nuestra expectativa no procesa ni redirige nada, por lo que se llama al procesamiento predeterminado al final de la acción. Eso solía estar bien con rspec, pero ahora es una expectativa no satisfecha. –

1

Igual @ 's respuesta con sugerencias de @ user2490003' Ryan-ahearn s comentario - pero todos ponen en algo más flexible y para RSpec 3.

# Safe to set globally, since actions can either render or redirect once or fail anyway 
    before do 
    allow(controller).to receive(:render).and_call_original 
    end 

    describe "get left panel" do 
    before do 
     # other setup 
     get 'left_panel' 
    end 

    it 'should render correct template for lelf_panel' do 
     # Sadly, render_template is primitive (no hash_including, no block with args, etc.) 
     expect(subject).to render_template('system/_left_panel') 
    end 

    it 'should render with correct local value' do 
     expect(controller).to have_received(:render) do |options| 
     expect(options[:locals][:key_from_very_long_hash]).to eq('value_of_key_from_very_long_hash') 
     end 
    end 
    end 
+0

Encontré este para ser el más útil, sin embargo, tuve que cambiar la firma del bloque, como al menos en mi versión de los rieles (3.2, no pregunte;) pasa el nombre del método que se está procesando. E.g en mi controlador tengo 'render" index ", locals: {presentador: presentador}' y en mi especificación ahora tengo 'expect (controller) .to have_received (: render) do | _method, options | '.. el resto es lo mismo. –

Cuestiones relacionadas