J'ai eu un modèle avec une méthode privée que j'aimerais spécifier avec RSpec,
comment fais-tu habituellement? Ne testez-vous que la méthode appelant la méthode privée?
ou aussi spec le privé? si oui, comment allez-vous?
Réponses
Trop de publicités?Je prends toujours cette approche: je veux tester l'API publique de ma classe expose.
Si vous avez des méthodes privées, vous ne les appelez de la part du public des méthodes de vous exposer à d'autres classes. Donc, si vous tester ces méthodes fonctionnent comme prévu dans toutes les conditions, vous avez également prouvé que le privé méthodes de travail.
Je vais vous avouer que je suis venu à travers certains particulièrement complexe méthodes privées. Dans ce cas extrême, vous voulez tester, vous pouvez faire ceci:
@obj.send(:private_method)
Pour les méthodes privées qui ont besoin de la couverture de code (que ce soit temporairement ou de façon permanente), utilisez la rspec-contexte-privé gem pour rendre temporairement privé méthodes publiques dans un contexte.
gem 'rspec-context-private'
Il fonctionne par l'ajout d'un contexte partagé à votre projet.
RSpec.shared_context 'private', private: true do
before :all do
described_class.class_eval do
@original_private_instance_methods = private_instance_methods
public *@original_private_instance_methods
end
end
after :all do
described_class.class_eval do
private *@original_private_instance_methods
end
end
end
Alors, si vous passez :private
sous la forme de métadonnées à un describe
bloc, les méthodes privées sera public dans ce contexte.
class Example
private def foo
'bar'
end
end
describe Example, :private do
it 'can test private methods' do
expect(subject.foo).not eq 'bar'
end
end