Rspec, des Rails: comment faire pour tester les méthodes privées de contrôleurs?
J'ai contrôleur:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Comment tester la méthode privée current_account
avec rspec?
P. S.-je utiliser Rspec2 et Ruby on Rails 3
- Cela ne veut pas répondre à votre question, mais les méthodes privées ne sont pas censés être testé. Vos tests doivent seulement se soucient de la vraie chose - votre API publique. Si vos méthodes de travail, puis privé de ceux qu'ils appellent aussi le travail.
- Je suis en désaccord. Il est important de tester n'importe quel suffisamment complexe pour la fonctionnalité dans votre code.
- Je suis en désaccord aussi. Si votre public API travaille, vous ne pouvez assumer vos méthodes privées fonctionnent comme prévu. Mais vos spécifications peut-être en passant par une coïncidence.
- Il serait préférable d'extraire la méthode privée dans une nouvelle classe qui est testable, si la méthode privée besoins de test.
- Le cadre du point de l'unité de test est d'aider à briser votre logique bas en testables composants. Parfois, ces petits composants n'a de sens que les méthodes privées, des choses qui ne sont pas appelés de l'extérieur de la classe -- mais ils ont encore besoin d'être testé. Comme le nombre de méthodes privées augmente, le nombre de tests vous avez besoin de tester chacun de ces sous-méthodes augmente géométriquement, comme vous êtes maintenant faut tester chaque permutation des entrées possibles pour tester chaque cas d'utilisation.
- Vous avez raison. Avec plus de recul et l'expérience, je suis en désaccord avec mes trois ans de commentaire. 🙂
- Les joies de google, le rendant facile à oublier datetime des timbres depuis l'année 2000.
- Voulant tester une méthode privée est un bon signe que la classe d'origine a trop de responsabilités. Il y a des exceptions à tout, bien sûr. Mais souvent nous inventer des exceptions, car le refactoring est dur.
Vous devez vous connecter pour publier un commentaire.
Utiliser #instance_eval
Je utiliser la méthode send. Par exemple:
Car "envoyer" peut appeler les méthodes privées
.send
?Où est le current_account méthode utilisée? Quel but a-t-elle?
En général, vous n'avez pas fait de test des méthodes privées, mais plutôt de tester les méthodes qui font appel au privé.
Vous devriez pas tester vos méthodes privées directement, ils peuvent et doivent être testés indirectement par l'exercice du code de méthodes publiques.
Cela vous permet de modifier les données internes de votre code en bas de la route sans avoir à changer vos tests.
Vous pourriez faire de vous des méthodes privées ou protégées en tant que public:
Il suffit de placer ce code dans votre essai de la classe en remplaçant votre nom de classe. Inclure l'espace de noms, le cas échéant.
Tests unitaires méthodes privées semble trop hors contexte avec le comportement de l'application.
Vous écrivez votre code d'appel en premier?
Ce code n'est pas appelée dans votre exemple.
Le comportement est la suivante: vous voulez un objet chargé à partir d'un autre objet.
Pourquoi tu veux écrire le test hors contexte du comportement que vous
devrait être d'essayer de décrire?
Fait ce code obtenir utilisé dans beaucoup d'endroits?
Besoin d'une approche plus générique?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
Utiliser le rspec-contexte-privé gem pour rendre temporairement privé méthodes publiques dans un contexte.
Il fonctionne par l'ajout d'un contexte partagé à votre projet.
Alors, si vous passez
:private
que les métadonnées d'undescribe
bloc, les méthodes privées sera public dans ce contexte.Si vous avez besoin de tester une fonction privée créer une méthode publique qui appelle le secteur privé.
Je sais que c'est un peu hacky, mais cela fonctionne si vous voulez les méthodes testable par rspec, mais n'est pas visible dans prod.
Maintenant, quand vous pouvez exécuter vous êtes spec comme suit: