2013-07-26 17 views
12

I casi di test di codifica per un'applicazione angolare con gelsomino. Ma molti metodi interni sono dichiarati come privati ​​nei servizi.Metodo privato Test unitario con Jasmine

Esempio:

App.service('productDisplay', function(){ 
    var myPrivate = function(){ 
     //do sth 
    } 
    this.doOfferCal = function(product, date){ 
     //call myPrivate 
     //do sth too 
     return offer; 
    } 
}); 

Utilizzando il gelsomino è semplice per testare il codice per "doOfferCal", ma voglio scrivere unit test per myPrivate troppo.

Come posso farlo?

Grazie in anticipo.

+0

Eventuali duplicati di [Come faccio testare una classe che ha metodi privati, campi o classi interne?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or -inner-classes) – Raedwald

risposta

0

Per testare le funzioni interne, chiamo la funzione esterna che chiama la funzione interna e quindi modifico il mio input in base a ciò che la funzione interna richiede. Quindi, nel tuo caso chiameresti "productDisplay" e cambierai il tuo input basandoti su ciò che "myPrivate" ha bisogno e quindi verificherà che hai l'output atteso. Puoi anche spiare "myPrivate" e testare le cose in questo modo usando .havebeencalledwith o .andcallthrough.

8

Esiste un motivo specifico per cui desiderate testare i vostri metodi privati?

Testando doOfferCal(), si sta verificando implicitamente che myPrivate() sta facendo la cosa giusta.

Anche se questo è per RailsConf, Sandi Metz parla molto bene allo what should be tested.

+0

Il mio "doOfferCal" chiama molti metodi privati ​​e alla fine restituisce un risultato complesso come perché pensava che sarebbe stato opportuno testare ogni metodo privato. A proposito, hai qualche suggerimento in questa situazione? – arnold

+2

Una scuola di pensiero è che i metodi privati ​​sono dettagli di implementazione. Testando i metodi privati, i test si interromperanno anche se il metodo pubblico sta ancora funzionando correttamente. Di conseguenza, potresti finire per creare test troppo fragili e spaventare gli sviluppatori dal migliorare/refactoring dell'implementazione. – achan

+2

Scusa, non mi sono reso conto che premere invio invierà il mio post .. Quello che farei in questo caso è test 'doOfferCal()' e quindi verificare l'oggetto complesso che restituisce. Se quel test passa, tutti i metodi privati ​​in mezzo funzionano come previsto. Sono sicuro che troverai persone che supportano metodi privati, ma questo è quello che ho trovato che funziona meglio per me in termini di scrittura di test unitari utili e mantenibili. – achan

2

Acan è al 100% a destra, ma se si ha realmente bisogno di chiamare il metodo privato nei test (quello che dovrebbe essere mai :-)) lo si può fare da:

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough(); 
myPrivateSpy.call();