Quanto posso fare o posso effettuare test TDD con oggetti di servizio?

2

Durante la stesura dei test PHPSPEC per un'applicazione Zend Framework 2, mi chiedo fino a che punto "scavare". Considera questo caso molto semplice:

Un DomainService (dominio nel senso URL della parola) dovrebbe essere in grado di elencare tutti gli oggetti Foo, funziona.

Fare teste / code del test non è semplice. Questo DomainService è alimentato tramite DI con DomainMapper. Questo DomainMapper è un Doctrine Mapper che trasforma le righe MySQL in Doctrine Entities. In teoria, non vorrei coprire che il mio codice può:

  1. istanzia il DomainService (ma questo viene fatto attraverso le fabbriche ZF2 - Sto bypassando completamente il processo di Factory nell'uso di phpspec's let). Questo tailspin in un test separato per la Factory, che ha bisogno di un oggetto localizzatore di servizi funzionale?
  2. verifica che possa trovare tutti gli oggetti Foo , ma ciò significa richiamare Doctrine ed eseguire una query SQL. Il test non dovrebbe essere dipendente dal database, presumo, non vorremmo che i dati esterni modifichino il test. Ma che cosa dovrei testare, che restituisce correttamente un array vuoto ? Gli errori di query semantica potrebbero creare condizioni di array vuote che sono errori. Accettiamo semplicemente che i test non lo coprano?

Dove disegna la linea? Testare i servizi DI' che interagiscono con i database non possono essere automaticamente off-limits?

    
posta Saeven 27.01.2016 - 19:22
fonte

1 risposta

2

Uno dei punti di forza principali di DI è la possibilità di iniettare versioni completamente diverse dei servizi dipendenti in base al proprio ambiente.
Più specificamente, nell'ambiente di test dell'unità, è possibile iniettare un'implementazione DomainMapper che restituisce solo i dati memorizzati e non accede in alcun modo al database. È anche possibile variare l'istanza di DomainMapper per ogni caso di test, in modo che in un test il mapper restituisca un errore, in un secondo test restituisce una lista vuota e in un terzo restituisce un elenco molto grande.

Quello che vuoi coprire nei test unitari di DomainService è

  • che DomainService soddisfa i suoi requisiti, se DomainMapper restituisce elenchi di oggetti Foo con varie lunghezze.
  • che DomainService non si rompe completamente, se DomainMapper segnala un errore o soddisfa i requisiti per la gestione di tali errori.

Essere in grado di creare un'istanza di un oggetto DomainService di solito non è un obiettivo di test separato, ma è implicitamente testato con gli altri test.
Essere in grado di ottenere un'istanza attraverso una fabbrica ZF2 sarebbe un test per quella fabbrica o forse un test di integrazione.

    
risposta data 28.01.2016 - 09:05
fonte

Leggi altre domande sui tag