Dovremmo deridere entità e valutare oggetti quando facciamo DDD?


9

Dopo aver letto un paio di articoli su newable vs iniettabili oggetti e come questi concetti si riferiscono ai servizi, gli enti e gli oggetti di valore di DDD, sono stato lasciato con qualche dubbio sull'utilizzo newables nel mio codice specialmente nel mio test di unità.

I candidati principali per i newable erano Entità e oggetti Valore, il che significa che invece di iniettare queste dipendenze in altri oggetti si dovrebbe solo newun'istanza di questi oggetti e usarli direttamente nel codice.

Tuttavia, le buone pratiche DDD sostengono l'assegnazione di responsabilità a entità e oggetti di valore se ritenuti appropriati. Quindi le entità e gli oggetti valore finiranno per avere una seria logica di business.

Ora, se un servizio opera su un'entità o un oggetto valore, dovrei deridere l'entità o l'oggetto valore e passare la derisione al servizio (la derisione richiederà un interfaceoggetto valore o entità che sembra essere sostenuto)?

O dovrei solo newun'entità / oggetto di valore e passare un'implementazione concreta al servizio e quindi violare il principio di unit test di test di una sola unità?



Dipende se sei un tester classico o beffardo
jhewlett

@jhewlett Un classicista non deriderebbe nulla; molto probabilmente un beffardo deriderebbe solo servizi, repository e fabbriche (che sono "iniettabili"), mai Entità o oggetti valore (che sono "oggetti nuovi").
Rogério,

@ Rogério, quando dici Servizi; intendi i Servizi applicativi o i Servizi di dominio?
w0051977,

@Songo, cosa hai deciso? Ti deridi: entità; Oggetti valore e servizi di dominio?
w0051977,

Risposte:


11

Sto leggendo che ritieni che i test unitari, proprio come gli oggetti SOLID, debbano avere "un motivo per rompere". È un obiettivo nobile, ma penso che scoprirai che in molti casi semplicemente non è fattibile. Uno di questi casi è qui, in cui si dispone di un oggetto di dominio "ricco" (DDD distingue tra Entità e Oggetti valore, che entrambi comprendono il "modello di dominio") che è una dipendenza del sistema in prova.

In queste situazioni, ho la filosofia che, datal'oggetto dominio ha una propria copertura di unit test completa, confidando che l'oggetto funzionerà come previsto in un unit test per un SUT diverso non viola necessariamente il test unitario. Se questo test dovesse interrompersi a causa di una modifica del dominio, mi aspetterei che anche il test unitario dell'oggetto dominio si interrompesse, conducendomi verso qualcosa da indagare. Se il test unitario dell'oggetto dominio è stato aggiornato correttamente come test rosso, quindi reso verde con la modifica e questo altro test fallito, non è necessariamente una cosa negativa; significa che le aspettative di questo altro test sono in conflitto con le nuove aspettative per il dominio, e devo assicurarmi che entrambi siano d'accordo l'uno con l'altro e i criteri generali di accettazione del sistema.

In quanto tale, deriderei un oggetto di dominio solo se detto oggetto di dominio producesse "effetti collaterali" indesiderabili dal punto di vista del test di unità (cioè toccando risorse esterne come archivi di dati), o se la logica dell'oggetto di dominio fosse sufficientemente complessa che posizionarlo nello stato corretto per il test diventa un blocco stradale per la definizione e il superamento del test.

Questa diventa quindi la domanda guida; quale è più facile? Utilizzare l'oggetto di dominio per lo scopo previsto all'interno del test o deriderlo? Fare ciò che è più semplice, fino a quando non è più l'opzione più semplice, ad esempio quando una modifica funzionale interrompe il test del servizio in modo complesso; in tal caso, riscrivere il test per produrre una simulazione che esponga i requisiti funzionali dipendenti dal servizio, senza la complessità che lo interrompe.

Capire che in entrambi i casi, dovrebbe esserci un test di integrazione che utilizza l'oggetto di dominio reale collegato al servizio reale che verifica l'interazione tra questi due a un livello di astrazione più elevato (come il test, ad esempio, non solo la funzionalità dietro un servizio endpoint, ma un proxy attraverso il quale l'oggetto di dominio viene serializzato e inviato).


In DDD, il "modello di dominio" include anche servizi di dominio, repository e fabbriche, non solo entità e oggetti valore.
Rogério,

0

Fidarsi della classe dipendente che funzioni correttamente, sperando che falliscano alcuni test unitari quando qualcosa non funziona, quindi dovrebbe essere testato molto bene . Forse mancano alcuni importanti test unitari? Può esserci un caso non testato che creerebbe un errore, che verrà prodotto nella mia classe di test originale e non verrebbe rilevato nella classe dipendente stessa.

Quindi secondo me per i test unitari, le classi dipendenti dovrebbero essere derise. Se non lo fa, allora è un test integrativo.

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.