rails matchers ruby-on-rails ruby ruby-on-rails-3 rspec

ruby-on-rails - matchers - ruby on rails selenium



Cómo probar la representación de un parcial con RSpec (6)

Quiero probar la representación de un parcial particular de acuerdo con algunas condiciones.

Por ejemplo, en el modelo show action view show.html.erb tengo:

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

Lo intenté:

response.should render_template("partial_name")

pero dice que produjo la plantilla "mostrar"

esperando <"partial1"> pero representando con <"model / show, layouts / application">

¿Que estoy haciendo mal?


A partir de Rails 5.1, se desaconseja este tipo de prueba y debe probar el controlador y la vista como un todo .

Comprobar 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'')


En lugar de la solución mencionada anteriormente, puede verificar alternativamente, si el html es que los renders parciales están presentes. P.ej

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


La última versión de rspec sugiere utilizar la sintaxis de expect lugar de:

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


Si está probando esto dentro de un controlador , debería 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 como se informa en la relishapp.com/rspec/rspec-rails/docs/controller-specs/… .

Y esta es la línea que probará si se representa el parcial "_new_customer":

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

Debe proporcionar el nombre del 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.


Si se usa en controladores rspec

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


También prueba esto

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