Ho un'interfaccia Serializer
con metodi serialize
e isSerializerFor
. Ho creato una prima implementazione di questo utilizzando TDD, e ho finito con un bel caso di test pulito che copriva completamente una buona implementazione pulita. Per avere un'idea più concreta, ecco un commit pertinente .
Ora qualcun altro (che non è abituato a fare TDD) ha iniziato a scrivere la seconda implementazione di questa interfaccia Serializer
. Questa persona ha capito che il test necessario per la seconda implementazione avrebbe qualche sovrapposizione con il mio test iniziale. Quindi è stata creata una classe di base astratta per i test del serializzatore , tenendo i metodi che si sospetta siano comuni a tutti casi di test del serializzatore.
Non sono contento di questo per due motivi principali. Prima di tutto, l'unica ragione per cui l'ereditarietà è usata qui è per il riutilizzo del codice, che è un grande odore di codice. In secondo luogo, questo interrompe il ciclo TDD. Se ora voglio creare un'altra implementazione di Serializer
e creare una derivata della classe di test di base, finisco per dover implementare tutto il codice di produzione in un solo passaggio.
D'altra parte, la semplice duplicazione del codice comune nelle classi di test sembra piuttosto strana. Spero che la composizione possa essere utilizzata qui in modo corretto per evitare questi problemi.
Sembra una situazione abbastanza comune. Come risolverebbe questo? Cosa faresti in modo diverso?