Je me demande comment valider les locaux passés à un gabarit de rendu dans le contrôleur
contrôleur: p> spécifications actuelle: p> it 'should render correct template for lelf_panel' do
# ...
get 'left_panel'
response.should render_template('system/_left_panel')
end
3 Réponses :
Autant que je sache, il n'y a aucun moyen d'examiner directement les habitants d'un modèle de la manière dont vous décrivez. P>
Vous pouvez modifier LOCALS_HASH en @LOCALS_HASH, puis examiner les résultats par les attributions (: locals_hash). P>
ou, vous pouvez utiliser des sélecteurs sur le HTML résultant et vérifier que certains contenus indicatifs sont là - par exemple, si LOCALAL_HASH affecte le titre de la page, vérifiez que le titre de la page HTML résultant est ce que vous attendez. P >
au lieu d'utiliser le correspondeur rendu_template code>, 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
Cela a fonctionné pour moi - mais seulement après avoir mis la commande Obtenir après le commentaire DO_Receive, et j'ai également besoin d'ajouter contrôler.stub (: rendu) pour éviter une erreur - mais je ne sais pas pourquoi ....
C'est la réponse supérieure. Changer une application pour répondre aux besoins d'une bibliothèque de test est une odeur de code.
@PhantomWhale Je viens de frapper la même erreur que vous avez rencontrée. Le problème est que notre attente ne rend pas ni redirige quoi que ce soit, le rendu par défaut est appelé à la fin de l'action. Cela était bon avec RSPEC, mais est une attente non satisfaite maintenant.
@ User94154's Logic est correct - Notre numéro d'attendant élimine l'original d'être appelé de sorte que le renditeur par défaut (sans argument) n'est appelé, et nous avons besoin d'une autre question d'attente / autorisée à attraper cela. Un moyen propre de résoudre ce problème est d'ajouter simplement .and_call_original code> à la fin de notre numéro d'attendu de notre attendu, il y a donc non seulement que cela s'y attend, mais aussi de l'avant et appelle l'original. Assurez-vous que vous avez
rendu_views code> activé en haut si vous êtes dans un test de contrôleur afin que les vues soient rendues.
Identique à la réponse de @ Ryan-ahearn avec des suggestions de @ user2490003 de la commentaires de @ user2490003 - mais tous mis dans quelque chose de plus flexible et de 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
J'ai trouvé celui-ci à être le plus utile, cependant, je devais changer la signature de bloc, au moins dans ma version de Rails (3.2, ne demandez pas;) Il passe le nom de la méthode rendu. Par exemple, dans mon contrôleur, j'ai rendu "index", locals: {présentateur: présentateur} code> et dans ma spécification, je suis maintenant
attendre (contrôleur). Pour avoir_received (: rendu) faire | _method, Options | code> .. Le repos est le même.