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?
Essayez aussi ceci
response.should render_template (: partial => 'partial_name')
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')
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.
À 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')
Si vous utilisez des contrôleurs rspec
expect(response).to render_template(partial: 'home/_sector_performance')
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