2013-04-24 16 views
24

È buona pratica scrivere test per metodi privati?Devo testare i metodi privati ​​usando RSpec?

Si consideri il seguente esempio semplice:

class Group 
    has_many :members 

    private 

    def release_members 
    members.each { |member| member.update_attributes group_id: nil } 
    end 
end 

sarebbe buona norma scrivere un test per il metodo release_members in RSpec? Credo che dovresti scrivere il test chiamando il metodo con send ie. group.send(:release_members) che a volte è disapprovato.

+1

Sembra che Ruby Rogue abbia un podcast di Sandi Metz che parla di questo argomento su http://rubyrogues.com/087-rr-book-clubpractical-object-orientated-design-in-ruby-with-sandi- metz /. L'argomento è che è possibile testare il metodo privato, se lo si desidera (eventualmente eliminare anche il test), ma soprattutto l'interfaccia pubblica che ha chiamato il metodo privato. –

risposta

17

È possibile trovare una discussione approfondita su questo argomento in queste diapositive da un discorso di Sandi Metz.

https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf

Lei dice che si può test-drive i metodi privati, se volete, ma che l'unico test che si dovrebbe preoccupare siete quelli collaudo l'interfaccia pubblica. Altrimenti potresti accoppiare troppo strettamente all'implementazione.

Penso che il punto da un lato, la suddivisione del servizio e dell'oggetto valore e il mettere quelli sotto test sia anche un buon modo se ti innervosisci su metodi privati ​​complessi che non sono testati.

+0

Grazie per avermi segnalato questo link. Sembra una grande risorsa! –

+1

Il link è rotto. – Oin

28

Non testare i metodi privati ​​poiché appartengono al meccanismo interno della classe. Lo scopo di Unit Test è verificare che la classe si comporti come previsto durante l'interazione con la sua interfaccia, ovvero i suoi metodi pubblici.

Se a un certo punto non ti senti a tuo agio con lunghi metodi privati, è probabilmente perché hai qui l'opportunità di estrarre quella logica al di fuori della classe e costruire un altro modulo o classe. Quindi, puoi testare l'unità, di nuovo solo la sua interfaccia, cioè i suoi metodi pubblici.

In alcuni rari casi, è necessario testare i metodi privati ​​perché l'intera logica interna è molto complessa e ti piacerebbe dividere il problema. Ma nel 99,9%, testare metodi privati ​​è una cattiva idea.

+0

Ha molto senso. Non è opzionale, non dovrebbe essere testato per dare l'opportunità di modificarli liberamente e preoccuparsi solo se si rompe l'API esterna. –

Problemi correlati