J'ai le contrôleur:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Comment tester une méthode privée current_account
avec rspec?
PS J'utilise Rspec2 et Ruby on Rails 3
ruby-on-rails
rspec
petRUShka
la source
la source
Réponses:
Utilisez #instance_eval
la source
J'utilise la méthode d'envoi. Par exemple:
Parce que "envoyer" peut appeler des méthodes privées
la source
.send
?Où la méthode current_account est-elle utilisée? A quoi cela sert-il?
Généralement, vous ne testez pas les méthodes privées mais testez plutôt les méthodes qui appellent la méthode privée.
la source
Vous ne devez pas tester vos méthodes privées directement, elles peuvent et doivent être testées indirectement en utilisant le code à partir de méthodes publiques.
Cela vous permet de modifier ultérieurement les éléments internes de votre code sans avoir à modifier vos tests.
la source
Vous pouvez rendre vos méthodes privées ou protégées publiques:
Placez simplement ce code dans votre classe de test en remplaçant votre nom de classe. Incluez l'espace de noms le cas échéant.
la source
la source
Les tests unitaires de méthodes privées semblent trop hors contexte avec le comportement de l'application.
Écrivez-vous d'abord votre code d'appel? Ce code n'est pas appelé dans votre exemple.
Le comportement est le suivant: vous voulez un objet chargé à partir d'un autre objet.
Pourquoi voulez-vous écrire le test hors de son contexte à partir du comportement que vous devriez essayer de décrire?
Ce code est-il utilisé dans de nombreux endroits? Besoin d'une approche plus générique?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
la source
Utilisez le gem rspec-context-private pour rendre temporairement les méthodes privées publiques dans un contexte.
Cela fonctionne en ajoutant un contexte partagé à votre projet.
Ensuite, si vous passez en
:private
tant que métadonnées à undescribe
bloc, les méthodes privées seront publiques dans ce contexte.la source
Si vous avez besoin de tester une fonction privée, créez une méthode publique qui appelle la méthode privée.
la source
Je sais que c'est un peu hacky, mais cela fonctionne si vous voulez que les méthodes soient testables par rspec mais pas visibles dans prod.
Maintenant, quand vous pouvez exécuter vos spécifications comme ceci:
la source