Dato che non ho molta esperienza nei test unitari, sto cercando di raccogliere alcune regole che imparerò per prime.
Fai attenzione a imparare "regole" per i problemi che non hai mai incontrato. Se ti imbatti in qualche "regola" o "migliore pratica", suggerirei di trovare un semplice esempio di giocattolo in cui "si suppone" che questa regola venga utilizzata e di provare a risolvere il problema da solo , ignorando ciò che dice la "regola".
In questo caso, potresti provare a inventare 2 o 3 classi semplici e alcuni comportamenti che dovrebbero implementare. Implementa le lezioni in qualsiasi modo sembri naturale e scrivi un test unitario per ogni comportamento. Fai un elenco di tutti i problemi che hai riscontrato, ad esempio se hai iniziato a lavorare in un modo, poi dovevi tornare indietro e cambiarlo in seguito; se ti sei confuso su come le cose dovrebbero andare insieme; se ti sei infastidito nello scrivere il bollettino; eccetera.
Quindi prova a risolvere lo stesso problema seguendo la "regola". Ancora una volta, fai un elenco dei problemi che hai riscontrato. Confronta gli elenchi e pensa a quali situazioni potrebbero essere migliori quando segui la regola e quali no.
Per quanto riguarda la tua vera domanda, tendo a favorire un approccio di porte e adattatori , in cui facciamo una distinzione tra "logica di base" e "servizi" (questo è simile alla distinzione tra funzioni pure e procedure efficaci).
La logica di base consiste nel calcolare le cose "all'interno" dell'applicazione, in base al dominio del problema. Potrebbe contenere classi come User
, Document
, Order
, Invoice
, fine del ecc di avere classi di base richiedono new
per le altre classi di base, dato che sono i dettagli "interni" di implementazione. Ad esempio, la creazione di un Order
potrebbe anche creare un Invoice
e un Document
dettaglio di ciò che è stato ordinato. Non c'è bisogno di deriderli durante i test, perché queste sono le cose reali che vogliamo testare!
Le porte e gli adattatori sono il modo in cui la logica di base interagisce con il mondo esterno. Questo è dove le cose come Database
, ConfigFile
, EmailSender
, tempo reale, ecc. Queste sono le cose che rendono difficile il test, quindi è consigliabile crearle al di fuori della logica di base e passarle secondo necessità (con iniezione di dipendenza o come argomenti del metodo, ecc.).
In questo modo, la logica di base (che è la parte specifica dell'applicazione, in cui vive l'importante logica di business, ed è soggetta alla maggior parte dei churn) può essere testata da sola, senza preoccuparsi di database, file, e-mail, ecc. Possiamo semplicemente passare alcuni valori di esempio e verificare di ottenere i valori di output corretti.
Le porte e gli adattatori possono essere testati separatamente, usando simulazioni per il database, il filesystem, ecc. Senza preoccuparsi della logica aziendale. Possiamo semplicemente passare alcuni valori di esempio e assicurarci che vengano memorizzati / letti / inviati / ecc. appropriatamente.