2013-08-21 19 views
30

Io uso GHUnit. Voglio testare i metodi privati ​​unitari e non so come testarli. Ho trovato molte risposte sul perché o perché non testare metodi privati. Ma non ho trovato su come testarli.Metodo di test unitario privato - obiettivo C

Non vorrei discutere se testare o meno i privati, ma mi concentrerò su come testarlo.

Qualcuno può darmi un esempio di come testare il metodo privato?

+0

Nello stesso modo in cui si verifica un metodo normale, qual è esattamente il problema che si sta affrontando? – Abizern

+0

La decisione di testare metodi privati ​​è una parte dello spazio del problema, non una parte dello spazio della soluzione. – dasblinkenlight

+0

@Abizern Si dice 'Non visibile @interface per myClass dichiara il selettore 'myMethod'' – Geek

risposta

86

I metodi in Objective-C non sono realmente privati. Il messaggio di errore che si ottiene è che il compilatore non può verificare che il metodo che si sta chiamando esista poiché non è dichiarato nell'interfaccia pubblica.

Il modo per aggirare questo è esporre i metodi privati ​​in una categoria di classe, che indica al compilatore che i metodi esistono.

Quindi aggiungere qualcosa di simile alla parte superiore del file di test case:

@interface SUTClass (Testing) 

- (void)somePrivateMethodInYourClass; 

@end 

SUTClass è il nome effettivo della classe che si sta scrivendo i test per.

Ciò renderà visibile il metodo privato e sarà possibile testarlo senza gli avvisi del compilatore.

+0

Ma facendo questo esporre questi metodi. – Geek

+4

Se lo fai nella tua classe di test, esponi solo i metodi per i test. – Abizern

+0

Ma hai detto che ho scritto questo nella classe che sto testando, non nella classe di test. – Geek

3

Se un metodo è privato, non è mai necessario verificarlo.

Pensa a questo. Dovresti testare il comportamento e il contratto dei tuoi metodi invece dell'implementazione interna

+1

Quindi ... Se avessimo un'implementazione interna che richiedesse il test, ciò indica un difetto di progettazione in cui quel metodo avrebbe dovuto essere effettivamente scritto come pubblico in un'altra classe, che deve essere nascosto in privato nella classe iniziale? – Mazyod

+2

In caso contrario, quindi (superficialmente parlando) non è possibile testare un'app intera in una singola classe con metodi privati. – Mazyod

+0

perfect Mazyod, sono completamente d'accordo con le tue informazioni supplementari – seufagner

7

Un po 'tardi, ma sono appena salito sul treno TDD.

I metodi privati ​​non devono essere testati. Perché tu scrivi metodi privati ​​per supportare i tuoi metodi pubblici, quindi testare i tuoi metodi pubblici verifica indirettamente i metodi privati ​​che li supportano.

Il principio "i metodi privati ​​non devono essere testati" è supportato dal principio "quando è necessario testare metodi privati, probabilmente significa che è necessario spostare tali metodi nella classe separata", rendendoli così pubblici .

+9

Quindi questo non è TDD, quindi se hai scritto un pezzo di codice senza prima scrivere il test dell'unità. Tuttavia, supponiamo che il tuo metodo pubblico usi pochi metodi privati, quando fallisce come fai a sapere quale fallisce? –

4

concordate con @Lord Zsolt

Inoltre si prega di nota successiva (da Test-Driven iOS Development ISBN-10: 0-321-77418-3, ISBN-13: 978-0-321-77418-7)

metodi di prova privati ​​

spesso mi è stato chiesto: “devo provare i miei metodi privati?”, o la relativa domanda “Come faccio a testare i miei metodi privati?” le persone che chiedono alla seconda questione hanno supposto che il risposta il primo è "Sì" e ora stanno cercando un modo per esporre le interfacce private delle loro classi nelle loro suite di test.

La mia risposta si basa sull'osservazione di un fatto sottile: avete già provato i vostri metodi privati ​​con . Seguendo l'approccio red-green-refactor comune nello sviluppo basato su test, hai progettato le API pubbliche degli oggetti per eseguire il lavoro necessario a tali oggetti.Con quel lavoro specificato dai test e l'esecuzione continuata dei test che ti assicura che non hai rotto nulla, sei libero di organizzare l'interno dello impianto idraulico delle tue classi come meglio credi. I tuoi metodi privati ​​sono già stati testati perché tutto quello che stai facendo è il comportamento di refactoring che hai già per i test .

Non si dovrebbe mai finire in una situazione in cui un metodo privato non è testato o non completamente testato, perché si creano loro solo quando si vede l'opportunità di ripulire il attuazione di metodi pubblici. Ciò garantisce che i metodi privati ​​ esistano solo per supportare il comportamento pubblico della classe e che sia necessario richiamarli durante il test perché sono sicuramente richiamati dai metodi pubblici.