Domanda

Continuando un'altra domanda simile ma sui test ( vedi qui ). Userò un esempio similare (pseudocodice)

class LinkDisplayer
    method constructor(LinkStorage)
    method displayLatestLinksByCategory(number_of_them)

class LinkStorage
    method saveLink(Link)
    method retrieveLatestLinksByCategory(category, number_of_them)

class Link
    method getUrl()
    method getDescription()
    method getCategory()

Così il linkDisplayer utilizza il LinkStorage per ottenere Link (s). Il comportamento Voglio testare è 'shouldDisplayLatestLinks. Nella mia prova, ho bisogno di prendere in giro LinkStorage, e lasciarlo tornare oggetti collegamento deriso con deriso getUrl () ecc comportamento?

'foglia' testing classi è abbastanza facile, ma trovo ancora molto difficile trovare la mia strada nel testare gli altri.

È stato utile?

Soluzione

Risposta breve:

Si dovrebbe essere beffardo / spegnendo tutto ciò che non è sotto il controllo diretto del vostro SUT. Solo testare il comportamento del vostro SUT, e mai scrivere un test che tenta di confermare comportamento che è al di fuori di tale ambito (es. test prende in giro / stub).


Long Risposta:

può essere difficile vedere la foresta per gli alberi. Quando si è colui che ha scritto tutto il codice è possibile trovare difficile a volte per evitare di test troppo granulari di un dettaglio di implementazione.

Hai l'idea giusta con la voglia di testare il comportamento, e le bandiere rosse è giusto così se ne andò quando hai iniziato a pensare al tuo test. Questo è esattamente ciò che TDD è tutto, in quanto contribuisce a esporre i difetti di progettazione. Basta ricordare, però, provare solo il comportamento del SUT. Tutto il resto dovrebbe essere sotto il controllo del vostro test di unità (prende in giro), altrimenti non sarebbe una prova di unità.

Mettetevi nella posizione del consumatore della classe LinkDisplayer, e chiedetevi "Come faccio a utilizzare questo nel codice di produzione?" si sarebbe probabilmente basta chiamare il metodo e si aspettano che ha funzionato. Tu certamente non avrebbe fatto una chiamata al database per garantire che lo ha fatto in realtà recuperare il numero corretto di elementi, o che sono stati ordinati per categoria vero? Allora, perché tentare di scrivere un test per questo.

Che cosa dovrebbe il risultato finale è di chiamare displayLatestLinksByCategory?

Vedo due possibili risposte a questa domanda, sulla base di campioni, e quali azioni si dovrebbe prendere in base a quelle risposte:

  1. ottenere alcune cose dal database utilizzando un metodo specifico, e visualizzare da qualche parte.
    • Se questo è ciò che il metodo fa, allora queste sono le uniche due cose che si dovrebbe prova per. Principalmente, che il metodo giusto è stato chiamato sul componente di accesso ai dati con gli argomenti giusti; e che i dati restituiti avuto modo di dove doveva andare.
    • Che cosa si dovrebbe non è il test è la forma *** dei dati restituiti come questo sarebbe solo testare il comportamento che il test è già in controllo completo su. Sarebbe come testando che una variabile è sufficiente impostare a true nel vostro test è in effetti vero.
    • ottenere alcune cose dal database utilizzando un metodo specifico e tornare it
    • A questo punto bandiere rosse dovrebbe andare fuori tutto il luogo. Se questa è l'unica cosa che questo metodo è buono per, allora dovete chiedere a voi stessi perché non sarebbe solo chiamare direttamente il metodo di accesso ai dati? Come il consumatore di questa classe che già avere il controllo su quale componente di accesso ai dati viene utilizzata ( voi a condizione che ) quindi perché avere un uomo di mezza.

* è ok per verificare come il vostro SUT risponde ai dati di forma particolare. Si potrebbe desiderare di gettare un esibirci se viene restituito nulla, o la raccolta è vuota. Si potrebbe voler ritagliare valori aggiuntivi dalla lista se più di N sono stati restituiti, ma non hai mai voglia di provare qualcosa che è al di fuori del comportamento del SUT. Perché tu sei in controllo diretto su come i dati restituiti da voi prende in giro è di forma, di test che avrebbe portato alla peggior tipo di test possibile; un test che non prova nulla, ma ancora passa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top