2010-05-06 10 views
6

Ho eseguito il refactoring "Replace Method with Method Object" descritto da Beck.Come posso testare i metodi in un oggetto metodo?

Ora, ho una classe con un metodo "run()" e un gruppo di funzioni membro che scompongono il calcolo in unità più piccole. Come posso testare queste funzioni membro?

La mia prima idea è che i miei test unitari siano fondamentalmente copie del metodo "run()" (con diverse inizializzazioni), ma con asserzioni tra ogni chiamata alle funzioni membro per verificare lo stato del calcolo.

(sto usando Python e il modulo unittest.)

class Train: 

    def __init__(self, options, points): 
     self._options = options 
     self._points = points 
     # other initializations 

    def run(self): 
     self._setup_mappings_dict() 
     self._setup_train_and_estimation_sets() 
     if self._options.estimate_method == 'per_class': 
      self._setup_priors() 
     self._estimate_all_mappings() 
     self._save_mappings() 

    def _estimate_all_mappings(): 
     # implementation, calls to methods in this class 

    #other method definitions 

ho sicuramente aspettative su ciò che i gli stati degli attributi membri dovrebbero essere prima e dopo le chiamate verso i diversi metodi come parte di l'implementazione del metodo run(). Devo fare affermazioni su questi attributi "privati"? Non so in che altro modo separare questi metodi.

L'altra opzione è che non dovrei davvero testarli.

+0

Alcuni codici o pseudo-codici sarebbero utili per comprendere la tua domanda. Da quello che hai scritto, sembra che tu possa beneficiare del metodo unittest.TestCase.setUp(). http://docs.python.org/library/unittest.html#unittest.TestCase.setUp – msw

+0

Ho modificato la tua domanda con il codice che hai fornito. Puoi controllare che il rientro sia corretto e modificarlo se necessario? –

+0

@ire_and_curses. Grazie, modificato un po '. –

risposta

10

Risponderò alla mia domanda. Dopo un po 'di lettura e riflessione, credo che non dovrei essere un'unità di testare questi metodi privati. Dovrei solo testare l'interfaccia pubblica. Se i metodi privati ​​che eseguono l'elaborazione interna sono abbastanza importanti da essere testati in modo indipendente e non sono solo coincidenze dell'attuale implementazione, forse questo è un segno che dovrebbero essere rielaborati in una classe separata.

+1

+1 per la risposta personale e piuttosto buono, se non è suscettibile di test dell'unità, forse non è una "unità". – msw

6

Mi piace la risposta, ma non sono d'accordo.

La situazione in cui si utilizza questo modello di progettazione è quella in cui è in corso un'operazione abbastanza complessa. Di conseguenza essere abili a verificare i singoli componenti di tale operazione direi altamente desiderabile.

Si ha quindi il problema delle dipendenze da altre risorse (che possono o non possono essere vere in questo caso).

È necessario essere in grado di utilizzare una qualche forma di ioc per iniettare qualche forma di simulazione per isolare la classe.

Oltre alla maggior parte delle strutture di derisione vi fornirà gli accessor per ottenere ai membri privati.

+0

Grazie per questa visione alternativa. Non ero consapevole di prendere in giro quando ho fatto questa domanda. –

+1

Ho anche cambiato idea da uno più simile al tuo. Se hai bisogno di test privato allora probabilmente dovrebbe essere spostato in un'altra classe. Comunque penso che la mia idea sia ancora valida per cose che dovrebbero essere interne, non private. –

Problemi correlati