Il problema che descrivi è molto reale e molto facile da incontrare quando TDDing. In generale, si può dire che non sta testando il comportamento incidentale stesso che è un problema, ma piuttosto se tonnellate di test dipendono da quel comportamento incidentale.
Il principio ASCIUTTO si applica al codice di prova e al codice di produzione. Questo può spesso essere una buona linea guida quando si scrive codice di test. L'obiettivo dovrebbe essere che tutto il comportamento "incidentale" specificato durante il percorso sia isolato, in modo che solo alcuni test fuori dall'intera suite di test li utilizzino. In questo modo, se è necessario ridefinire tale comportamento, è necessario modificare solo alcuni test anziché una grande parte dell'intera suite di test.
Questo è il modo migliore per utilizzare copiosamente interfacce o classi astratte come collaboratori, poiché ciò significa che si ottiene un accoppiamento di classe bassa.
Ecco un esempio di cosa intendo. Supponiamo che tu abbia qualche tipo di implementazione MVC in cui un Controller dovrebbe restituire una Vista. Supponiamo che abbiamo un metodo come questo su un BookController:
public View DisplayBookDetails(int bookId)
L'implementazione dovrebbe utilizzare un IBookRepository iniettata per ottenere il libro dal database e quindi convertire che per una visualizzazione di quel libro. Potresti scrivere molti test per coprire tutti gli aspetti del metodo DisplayBookDetails, ma potresti anche fare qualcos'altro:
Definire un'interfaccia IBookMapper aggiuntiva e inserirla nel BookController oltre a IBookRepository. L'implementazione del metodo potrebbe quindi essere qualcosa di simile:
public View DisplayBookDetails(int bookId)
{
return this.mapper.Map(this.repository.GetBook(bookId);
}
Ovviamente questo è un esempio di troppo semplicistico, ma il punto è che ora è possibile scrivere una serie di test per l'implementazione IBookMapper reale, il che significa che quando si prova il metodo DisplayBookDetails, si può semplicemente usare uno Stub (meglio generato da un framework mock dinamico) per implementare la mappatura, invece di provare a definire una relazione fragile e complessa tra un oggetto Dominio libro e il modo in cui è mappato.
L'uso di un IBookMaper è sicuramente un dettaglio di implementazione incidentale, ma se si utilizza un meglio ancora un contenitore SUT Factory o auto-beffardo, la definizione di tale incidentale comportamento è isolato il che significa che se in seguito si decide di refactoring l'implementazione, puoi farlo cambiando solo il codice di prova in pochi punti.
Penso che sarebbe d'aiuto se si includesse un esempio. Sicuramente una domanda valida, ma potrebbe essere interpretata in modi diversi. –