Come specificare un metodo privato

Ho un modello con un metodo privato che mi piacerebbe specare con RSpec,
come fai di solito? Metti alla prova solo il metodo chiamando quello privato?
o anche spec quella privata? se sì, come si fa?

Prendo sempre questo approccio: voglio testare l’API pubblica che la mia class espone.

Se hai metodi privati, li chiami solo dai metodi pubblici che esponi ad altre classi. Quindi, se verifichi che quei metodi pubblici funzionano come previsto in tutte le condizioni, hai anche dimostrato che anche i metodi privati ​​che usano funzionano.

Devo ammettere che mi sono imbattuto in alcuni metodi privati ​​particolarmente complessi. Nel caso estremo che vuoi testarli, puoi farlo:

@obj.send(:private_method) 

Per i metodi privati ​​che richiedono la copertura del codice (temporaneamente o permanentemente), utilizzare la gem rspec-context-private per rendere temporaneamente pubblici i metodi privati ​​all’interno di un contesto.

 gem 'rspec-context-private' 

Funziona aggiungendo un contesto condiviso al tuo progetto.

 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 

Quindi, se si passa :private come metadata a un blocco describe , i metodi privati ​​saranno pubblici all’interno di quel contesto.

 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 

Se vuoi testare un’aspettativa su un metodo privato, la risposta accettata non funzionerà (almeno non che io sappia, quindi sono aperto alla correzione su questo punto). Quello che ho fatto invece è persino più sporco – nel test stesso, basta esporre il metodo ridefinendolo:

 def object_to_test.my_private_method super end 

Funziona su Ruby 1.8, non può commentare nessuno dei più recenti runtime.