web-dev-qa-db-fra.com

Comment tester le rendu d'un partiel avec RSpec

Je veux tester le rendu d'un partiel particulier selon certaines conditions.

Par exemple, dans le modèle afficher la vue d'action show.html.erb J'ai:

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

J'ai essayé:

response.should render_template("partial_name")

mais il indique qu'il a rendu le modèle "show"

attente <"partial1"> mais rendu avec <"model/show, layouts/application">

Qu'est ce que je fais mal?

46
Pavel

Essayez aussi ceci

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

La dernière version de rspec suggère d'utiliser la syntaxe expect plutôt que should:

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

Si vous testez ceci dans un contrôleur , vous devriez faire quelque chose comme ceci:

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

Notez que nous avons besoin render_views comme indiqué dans documentation .

Et c'est la ligne qui testera si le rendu "_new_customer" est rendu:

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

Vous devez fournir le nom du partiel avec le trait de soulignement initial.

Faites également attention car dans votre code les instructions IF et ELSE rendent la même chose.

5
Diego D

À partir de Rails 5.1, ce type de test est déconseillé et vous devez tester le contrôleur et la vue dans son ensemble .

Vérifier quelle partie est rendue par le contrôlé fait partie des détails d'implémentation que vous ne devriez pas tester.

Par conséquent, je vous suggère d'écrire un test de demande et de vérifier qu'un texte pertinent de votre partiel est présent dans le corps de la réponse.

get root_path
expect(CGI.unescape_html(response.body)).to include('Hello World')
0
coorasse

Si vous utilisez des contrôleurs rspec

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

Vous pouvez également tester si votre contrôleur a déduit l'action requise.

require "spec_helper"

describe "model_name/new.html.erb" do
 it "infers the controller path" do
  expect(controller.request.path_parameters["action"]).to eq("new")
 end
end

Les documents sont ici

0
Dende