Comment valider les locaux de rendre modèle dans rspec
-
27-10-2019 - |
Question
Je me demande comment valider les gens du pays passé à render modèle dans le contrôleur
Contrôleur:
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 actuel:
it 'should render correct template for lelf_panel' do
# ...
get 'left_panel'
response.should render_template('system/_left_panel')
end
Maintenant, je dois terminer Rcov pour ce contrôleur, alors je dois ajouter / modifier les spécifications pour couvrir les résultats « de some_condition ». et je veux validate « lelf_panel » habitants passaient à rendre, comme si je ne l'render_template valider, page partielle rendu pour les résultats sont les mêmes.
Je vérifie la 'render_template' dans rspec docs dans http://rubydoc.info/gems/rspec -rails / 2.8.1 / RSpec / Rails / Matchers / RenderTemplate: render_template
il fournit seulement et 2e params pour le message, alors comment puis-je tester les gens du pays passé à rendre?
La solution
pour autant que je sache, il n'y a aucun moyen d'examiner directement la population locale pour un modèle de la façon que vous décrivez.
Vous pouvez changer locals_hash à @locals_hash puis examiner les résultats par cessionnaires (: locals_hash).
Ou, vous pouvez utiliser des sélecteurs sur le résultant HTML et vérifier que certains contenus indicatif est là -. Par exemple, si locals_hash affecte le titre de la page, de vérifier que le titre de la page HTML qui en résulte est ce que vous attendez
Autres conseils
Au lieu d'utiliser le matcher render_template
, vous pouvez utiliser une attente sur l'objet du contrôleur.
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
Comme @ ryan-Ahearn 'de réponse avec des suggestions de @ user2490003' Commentaire de - mais tous mis en quelque chose de plus souple et 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