Dois-je tester les méthodes privées à l'aide de RSpec?
Est-il de bonnes pratiques pour écrire des tests pour les méthodes privées?
Considérons l'exemple simple suivant:
class Group
has_many :members
private
def release_members
members.each { |member| member.update_attributes group_id: nil }
end
end
Serait-il de bonnes pratiques pour écrire un test pour la release_members méthode dans RSpec? Je crois que vous devriez écrire le test d'appeler la méthode avec envoyer ie. group.send(:release_members)
qui est parfois mal vu.
- Il semble que ruby coquins a un podcast par Sandi Metz qui parle de ce sujet dans le rubyrogues.com/.... L'argument est que vous pouvez tester la méthode privée si vous le souhaitez (même éventuellement supprimer le test), mais le plus important est l'interface publique qui a appelé la méthode privée.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez trouver une discussion approfondie de ce sujet dans ces diapositives à partir d'un Sandi Metz parler.
https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf
Elle dit que vous pouvez tester vos méthodes privées si vous le souhaitez, mais que le seul test qui devrait vous inquiéter sont ceux des tests de l'interface publique. Sinon, vous pouvez peut-être couplage trop étroitement à la mise en œuvre.
Je pense que le point par toch, sur le fractionnement du service et de la valeur de l'objet et de mettre ceux de moins de tests est également bon si vous êtes s'énerver à propos de complexe privé des méthodes qui ne sont pas testés.
Vous ne devriez pas tester les méthodes privées comme ils appartiennent à l'un mécanisme interne de la classe. L'objectif de test est de vérifier que votre classe se comporte comme prévu lors de l'interaction avec par le biais de son interface, c'est à dire ses méthodes publiques.
Si, à un certain point, vous n'êtes pas à l'aise avec long méthodes privées, c'est probablement parce que vous avez ici la possibilité de tirer de cette logique en dehors de la classe et de construire un autre module ou de la classe. Ensuite, vous pouvez unité de test, et encore une fois seulement de son interface, c'est à dire ses méthodes publiques.
Dans certains cas rares, il est nécessaire de tester les méthodes privées car l'ensemble de la logique interne est très complexe et que vous souhaitez diviser le problème. Mais dans 99,9%, les tests méthodes privées est une mauvaise idée.