Quando dovrei usare oggetti finti?


14

Ho letto molte cose su TDD ma ho ancora dubbi. Ad esempio, ho questi diagrammi di classe:

inserisci qui la descrizione dell'immagine

È un semplice esempio, solo per conoscere TDD e oggetti finti.

Quale test dovrei scrivere per primo? Prodotto , quindi Linea e ultimo, Ordine ? Se lo faccio, dovrei usare Line e Product per testare Order o dovrei usare Mock Objects? Quando dovrei usare Mock Objects? Dovrei usare UML con XP e TDD?

Non ho ancora queste cose.

Risposte:


10

A giudicare dal diagramma, il prodotto è una classe di dati stupida, senza funzionalità da testare. Quindi inizierei a scrivere test per (e implementare, in stile TDD) prima Linea e poi Ordine, nella scala delle dipendenze. Di solito è sensato sottoporre a test le tue classi di livello inferiore prima di iniziare a lavorare su classi di livello superiore (cioè che dipendono dal livello inferiore). Ciò rende più efficace la cattura dei bug.

La necessità di utilizzare oggetti simulati dipende dalle dipendenze effettive della classe testata. Se si tratta di classi semplici che puoi facilmente istanziare e configurare con qualsiasi dato / stato desiderato richiesto per i tuoi test, non hai bisogno di beffe. (Questo sembra essere il caso del tuo esempio di progettazione qui.) Tuttavia, se una delle dipendenze è difficile da inizializzare / ha dipendenze estese in sé / ha effetti collaterali indesiderati / dipende da una risorsa esterna come un DB, allora ha senso per usare invece un oggetto finto.


Come ho detto prima, era uno scenario semplice, solo per conoscere gli oggetti TDD e Mock ... Un'ottima risposta, grazie. E che dire di UML? Dovrei evitarlo?

@thomas, non c'è bisogno di evitare UML, non è in conflitto con TDD. UML è ottimo per visualizzare / comunicare problemi di progettazione. Questo può essere estremamente utile in determinate fasi di sviluppo. Tuttavia, il design si evolve e cercare di mantenere un diagramma di sistema UML bello e dettagliato in sincronia con il codice può rapidamente diventare un peso. Quindi ricorda di buttarlo via quando non ti serve più :-)
Péter Török,

1
@thomas, tra la convenzione qui è di votare le risposte che ritieni utili, facendo clic sulla freccia su accanto alla risposta :-)
Péter Török

4

Non vedo molto bisogno di oggetti finti qui. Come sottolineato da altri, sono necessari soprattutto se le dipendenze sono difficili da configurare.

Ad esempio, li abbiamo usati con i progetti Ruby on Rails quando abbiamo testato i controller e avevamo bisogno di un login utente che avrebbe richiesto una chiamata a un altro controller e la memorizzazione di parte delle sue informazioni in un cookie. In questo caso è utile deridere un utente che ha restituito true, quando gli viene chiesto un determinato privilegio di accesso.


2

Normalmente per i test si desidera isolare il sistema / oggetto in prova, quindi si deriderebbe tutto ciò che non lo è. Quindi, usando il tuo diagramma di classe, quando collaudi un oggetto ordine, usa un finto per l'oggetto linea. Durante il test della linea, utilizzare un finto per ordine e prodotto. Durante il test del prodotto, utilizzare il finto per Line.


Poiché il prodotto non dipende da Line, non è necessario (né in alcun modo) utilizzare un finto per Line lì. Lo stesso vale per linea e ordine.
Péter Török,

2

"TDD è principalmente una tecnica di progettazione con un effetto collaterale di garantire che il codice sorgente sia accuratamente testato dall'unità" - Scott W. Ambler

L'idea è quella di trovare il design scrivendo unit test. Nel tuo caso, sembra che tu abbia già il design in atto, che in qualche modo sconfigge lo scopo di TDD (supponendo che il tuo design sia definitivo).

Per quanto riguarda il beffardo. Se vuoi deridere, ti suggerisco di deridere il Prodotto quando scrivi i test per Line e simula la Linea quando collaudi Order. Ma potrebbe essere eccessivo qui. Personalmente cerco di limitare il beffardo il più possibile e lo uso per disaccoppiare le dipendenze da classi esterne (come le istanze di database).


2
Ho solo un semplice diagramma di classe ...

-1 Quindi pensare al design (incluso scrivere un diagramma di classe) ti impedisce di fare TDD? Sembra semplicemente sbagliato.
Bjarke Freund-Hansen,

1
@bjarkef: leggi di nuovo la mia risposta, per favore. Se il progetto è definitivo, non è davvero possibile utilizzare TDD per scacciare il progetto, che è ciò di cui si occupa TDD. E penso che questo sia anche ciò che rende confuso l'OP: ha già una soluzione e ora sta cercando di scrivere test per questo. "Quali test dovrei scrivere per primo, Prodotto o Ordine". Questa domanda non è molto rilevante se scrivi prima i test.
Martin Wickman,

Come si determina che il progetto è definitivo senza alcun test o codice di produzione? Supponendo di voler creare qualcosa che funzioni.
JeffO,

@Jeff: Non puoi, ovviamente. Questa è una cosa con cui TDD può aiutarti.
Martin Wickman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.