2012-03-30 14 views
39

Quiero probar la representación de un parcial en particular de acuerdo con algunas condiciones.Cómo probar la representación de un parcial con RSpec

Por ejemplo, en el modelo de programa de acción de la vista show.html.erb tengo:

<% if condition1 %> 
<%= render :partial => "partial1" %> 
<% else %> 
<%= render :partial => "partial1" %> 
<% end %> 

Traté:

response.should render_template("partial_name") 

pero dice que es traducida como "espectáculo" plantilla

esperando < "partial1"> pero representando con < "model/show, diseños/application ">

¿Qué estoy haciendo mal?

+2

https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/view-specs/view-spec – apneadiving

+1

que necesito para probar en controller_spec – Pavel

+0

'render_template' delegados a 'assert_template' en [action_controller/test_case.rb] (https: // github.com/rails/rails/blob/master/actionpack/lib/action_controller/test_case.rb # L67) así que ahí es donde vive la documentación más detallada –

Respuesta

61

También intente esto

 
response.should render_template(:partial => 'partial_name') 
+0

gracias, lo intentaré ahora – Pavel

+9

Funciona, pero debe especificar 'render_views' si estás escribiendo especificaciones del controlador. – Fabio

+0

¿Se puede ampliar en la función render_views? render_template no funciona para mí en las pruebas de controlador. –

-3

En lugar de la solución anteriormente mencionada se puede comprobar como alternativa, si el HTML que hace que la parcial está presente. P.ej.

response.body.should have_tag("div#foo") 
+1

Para mí' response.body.should ... 'funciona. –

+2

que sería una prueba bastante frágil, tal que la prueba fallaría si cambiaras el html, pero lo que realmente estás probando es si la plantilla se procesa o no. – jbielick

+0

Las especificaciones deben probar el rendimiento de la prueba parcial, no el cuerpo html. – Argonus

23

Última versión rspec sugieren utilizar expect sintaxis en lugar de should:

expect(response).to render_template(partial: 'partial_name') 
2

Si está probando esto dentro de un controlador deque debe hacer algo como esto:

RSpec.describe Users::RegistrationsController, type: :controller do 
    describe "GET #new" do 
    render_views 

    it "render customer partial" do 
     get :new 
     expect(response).to render_template :new 
     expect(response).to render_template(partial: '_new_customer') 
    end 
    end 
end 

Tenga en cuenta que necesitamos render_views según lo informado i nto documentation.

Y esta es la línea que pondrá a prueba si se vuelve parcial "_new_customer":

expect(response).to render_template(partial: '_new_customer') 

es necesario proporcionar el nombre de la parcial con el guión bajo inicial.

También tenga cuidado porque en su código las sentencias IF y ELSE representan la misma cosa.

+0

¿De verdad debería probar una vista en una especificación de controlador? RSpec proporciona especificaciones/vistas para esto; o puede usar pruebas de características/integración. –

+0

@KrisKhaira bien, puede que necesite ambos. En una especificación de controlador, puede probar que el controlador va a representar la plantilla/vista esperada. Luego, en las pruebas de características/integración puede probar profundamente el floe completo, en particular la vista para probar si el usuario puede realizar las acciones esperadas. –

0

Si se utiliza en los controladores rspec

expect(response).to render_template(partial: 'home/_sector_performance') 
0

A partir de los carriles 5.1, this kind of test is discouraged and you should test the controller and the view as a whole.

La comprobación de qué parte es renderizada por el control es parte de los detalles de implementación que no debe probar.

Por lo tanto, le sugiero que escriba una prueba de solicitud y verifique que algún texto relevante de su parcial esté presente en el cuerpo de la respuesta.

get root_path 
expect(CGI.unescape_html(response.body)).to include('Hello World') 
Cuestiones relacionadas