Should I mock a Domain Service?
Risposte brevi
- Dipende.
- Fornire duplicati di test che sostengono i servizi di dominio spesso essere una buona idea.
- Fornire mock che sostengono i servizi di dominio può essere una buona idea.
Quanto segue avrà più senso se si ha familiarità con i diversi sapori dei duplicati di prova; Mock Are Stub è un punto di partenza accessibile.
Risposte più lunghe:
L'uso dei duplicati di prova è un compromesso. Ci sono dei rischi associati al fatto che il sistema in esame non sta parlando con un vero collaboratore, e ci sono dei benefici. Parte del nostro mestiere è capire il commercio che stiamo facendo.
Ci sono proprietà che vogliamo che i nostri test abbiano.
- Vogliamo che i test siano veloci, in modo che eseguirli sia meno di una distrazione.
- Vogliamo che i test siano isolati, in modo che possiamo eseguirli in parallelo e risparmiare ancora più tempo per l'orologio da parete.
- Vogliamo che i test siano semplici: meno righe di codice nella suite di test significano meno bug nella suite di test
- Vogliamo che i test siano comprensibili - vogliamo che la maggior parte del codice descriva il test , piuttosto che descrivere un mucchio di scaffold
- Vogliamo che i test siano stabili - se non apportiamo alcuna modifica, una seconda esecuzione di un test dovrebbe sempre darci lo stesso risultato del primo
- Vogliamo che i test siano accurati: un test non funzionante dovrebbe sempre indicare un errore.
Ma tutti questi sono solo troppi a meno che
- I test richiamano la nostra attenzione sugli errori che facciamo.
Sostituire i veri collaboratori (che tendono ad essere disordinati) con i falsi collaboratori (che tendono ad essere semplici) aumenta la probabilità di perdere determinate categorie di errori; quindi è meglio essere sicuri che quando facciamo ciò, i benefici che otteniamo compensino i maggiori rischi.
Non ricaviamo quasi nessun ulteriore beneficio dal prendere in giro un valore. Oggetti di valore ben progettati sono già ben isolati, senza effetti collaterali e tendono ad esprimere la semantica di un test meglio di quanto farebbe un sostituto. Vivono interamente all'interno del nucleo funzionale della tua applicazione.
Se esegui la stessa matematica sulle entità, vedrai che non ha molto senso deridere un'entità neanche.
Con i servizi di dominio , tuttavia, i compromessi sembrano davvero interessanti. I servizi di dominio sono il meccanismo tramite il quale una parte incapsulata del modello di dominio comunica con i suoi collaboratori; quei collaboratori potrebbero essere altre parti dello stesso modello, oppure potrebbero essere più lontani.
Quando Evans descrisse i servizi di dominio nel blue book, inserì tra gli esempi motivanti che necessitavano di accedere ai servizi di applicazioni e infrastrutture - codice che vive al di fuori del limite di astrazione del modello di dominio. I servizi di dominio sono spesso proxy per comunicare gli effetti collaterali, che possono persino superare i limiti del processo.
Mock across architecturally significant boundaries, but not within those boundaries.
I servizi di dominio sono spesso proxy per il codice attraverso un limite architettonicamente significativo.
Quindi, se hai un servizio di dominio che è un'astrazione in memoria - Gli ordini devono accedere a un servizio di calcolo delle imposte in memoria, allora il test double non fornisce un beneficio marginale tanto quanto un test double che sta in per un servizio di dominio che ha bisogno di parlare con un database ....
In altre parole, ci sono molte cose diverse sotto il termine "servizio di dominio" e hanno diversi compromessi.
È molto più probabile che utilizzi un test double quando il comportamento effettivo del servizio è difficile da prevedere o difficile da limitare.
IOfferCalculator.CalculateValue is a simple method in this case - it does not connect to a database and it does not call any other methods.
Sembra che il vantaggio marginale dell'introduzione di un finto sia piccolo; quindi consiglierei di usare l'implementazione reale in questa circostanza.