54 votes

Comment spécifier une méthode privée

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?

118voto

Ariejan Points 6567

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)

6voto

barelyknown Points 2875

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X