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 newper le altre classi di base, dato che sono i dettagli "interni" di implementazione. Ad esempio, la creazione di un Orderpotrebbe anche creare un Invoicee un Documentdettaglio 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.