Probabilmente vorrai almeno un assembly di test unitario per assemblaggio nel sistema.
Si potrebbe sostenere che potrebbe valere la pena suddividere i test di business logic in più assembly di test, ad esempio "BllTests.Customer, CllTests.Product, BllTests.Basket" ecc.
La cosa peggiore che puoi fare è incollarli tutti in un'unica grande assemblea, è l'equivalente di avere l'intero progetto in un unico assieme: rende le cose molto più difficili da gestire. Il tuo feedback di prova verosimilmente proviene da un server di Continuous Integration, quindi avrai bisogno di un'accuratezza abbastanza precisa di quale test sta fallendo e quale parte del sistema ha un impatto, così puoi prendere decisioni sull'impatto dello stesso errore.
NON DEFINITIVAMENTE vuoi i test nello stesso assembly di qualsiasi codice di produzione. Se li hai inseriti tutti nel codice di produzione, dovrai distribuire un gruppo di assembly di terze parti al tuo server di produzione che non hanno alcuna utilità per il prodotto stesso e aggiungere semplicemente un altro punto di errore!
Modifica
OK, quindi abbiamo a che fare con un monolite. Ciò significa che è improbabile che si abbia l'astrazione dell'interfaccia (ad esempio tutte le classi che eseguono la logica implementando un ILogicInterface, quindi è possibile testare le interfacce invece di provare a eseguire test su classi concrete).
Questo sarà un problema, dovrai fare test senza l'approccio standard di deridere le interfacce dipendenti (usando qualcosa come Rhino Mocks).
Suggerirei che il metodo migliore per te sia iniziare in piccolo: crea un solo assemblaggio "BllTests.Customer". Quindi, lentamente, sposta la tua implementazione per ereditare le interfacce, iniziando proprio nella parte inferiore del codice (l'astrazione dell'accesso ai tuoi dati è un ottimo inizio). Quindi unitamente prova i tuoi piccoli cambiamenti (stiamo parlando di 4-5 metodi all'interno di una singola classe). Quindi scegli la successiva piccola unità di logica e ripeti.
Quando hai una buona porzione di codice che eredita le interfacce: inizia a suddividere il tuo codice in assembly separati: "Bll.Implementation" e "Bll.Interfaces".
Il potenziamento progressivo è il nome del gioco, non c'è molto da fare per testare il codice spaghetti, i test unitari saranno molto fragili o non testare abbastanza percorsi attraverso il codice per renderli utili indicatori se hai un problema di codice .
Se non riesci a modificare la base di codice principale (non sempre un'opzione), beh, suggerirei comunque l'approccio di più test assembly. Prova a fare in modo che tutto il nuovo codice venga eseguito in assemblaggi separati, per evitare che il tuo monolite si ingrandisca. Ma nel frattempo, mostra come un insieme di piccoli e coerenti assembly può essere molto più facile da gestire: dare l'esempio.