Al momento c'è un dibattito nel nostro team sul fatto che modificare la progettazione del codice per consentire il testing di unità sia un odore di codice o fino a che punto può essere fatto senza essere un odore di codice. Ciò è avvenuto perché abbiamo appena iniziato a mettere in atto pratiche che sono presenti in quasi tutte le altre società di sviluppo software.
In particolare, avremo un servizio API Web che sarà molto sottile. La sua principale responsabilità sarà il marshalling di richieste / risposte Web e la chiamata di un'API sottostante che contenga la logica aziendale.
Un esempio è che intendiamo creare una fabbrica che restituirà un tipo di metodo di autenticazione. Non abbiamo bisogno che erediti un'interfaccia in quanto non prevediamo che sia mai qualcosa di diverso dal tipo concreto che sarà. Tuttavia, per testare l'unità del servizio API Web dovremo prendere in giro questa fabbrica.
Ciò significa essenzialmente che progettiamo la classe di controller API Web per accettare DI (tramite il suo costruttore o setter), il che significa che stiamo progettando parte del controller solo per consentire DI e implementare un'interfaccia che altrimenti non ci serve, o che usiamo un framework di terze parti come Ninject per evitare di dover progettare il controller in questo modo, ma dovremo comunque creare un'interfaccia.
Alcuni membri del team sembrano riluttanti a progettare il codice solo per motivi di test. Mi sembra che ci debba essere qualche compromesso se speri di testare l'unità, ma non sono sicuro di come alleggerire le loro preoccupazioni.
Giusto per essere chiari, questo è un progetto nuovo di zecca, quindi non si tratta in realtà di modificare il codice per abilitare i test unitari; si tratta di progettare il codice che scriveremo per essere testabile in unità.