9
votes

Comment valider les sections locales du modèle de rendu dans RSPEC

Je me demande comment valider les locaux passés à un gabarit de rendu dans le contrôleur

contrôleur: p> xxx pré>

spécifications actuelle: p>

it 'should render correct template for lelf_panel' do
  # ... 
  get 'left_panel'
  response.should render_template('system/_left_panel')
end   


0 commentaires

3 Réponses :


2
votes

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.

Vous pouvez modifier LOCALS_HASH en @LOCALS_HASH, puis examiner les résultats par les attributions (: locals_hash).

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.


0 commentaires

21
votes

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


4 commentaires

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 à 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 activé en haut si vous êtes dans un test de contrôleur afin que les vues soient rendues.



4
votes

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


1 commentaires

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} et dans ma spécification, je suis maintenant attendre (contrôleur). Pour avoir_received (: rendu) faire | _method, Options | .. Le repos est le même.