Nel nostro progetto, un assembly combina la logica per il contenitore IoC, gli interni del progetto e il livello di comunicazione. La versione corrente si è evoluta per avere solo classi interne negli assembly addin.
Il mio problema principale con questo approccio è che il punto di ingresso è disponibile solo sul contenitore IoC. Non è possibile utilizzare nient'altro che reflection per inizializzare l'assembly.
Tutto ciò che sta dietro l'interfaccia IoC è definito come dettaglio dell'implementazione e quindi non è destinato ad usi esterni. È risaputo che non dovresti testare i dettagli dell'implementazione (come i metodi privati e interni), perché dovrebbero essere testati attraverso l'interfaccia pubblica. È anche risaputo che i test non devono utilizzare il contenitore IoC per configurare i SUT, poiché ciò comporterebbe troppe dipendenze. Quindi utilizziamo l'attributo InternalsVisibleTo per rendere visibili gli interni ai nostri gruppi di test e testare i cosiddetti dettagli di implementazione.
Ho riconosciuto che un problema potrebbe essere la confusione tra le diverse preoccupazioni in quell'assemblea, cambiando questo renderebbe questa discussione inutile, perché le classi devono essere definite pubbliche. Ignorare le mie preoccupazioni con questo, non è la necessità di testare una classe sufficiente per renderlo pubblico, gli usi di InternalsVisibleTo sembra non intenzionale e un po '"hacky". L'approccio per testare solo contro il contenitore IoC pubblicamente disponibile è troppo costoso e comporterebbe test dello stile di integrazione.
I professionisti dell'uso di internals sono, che gli usi sono ben noti e non devono essere implementati come dovrebbe essere un metodo pubblico (documentazione, completezza, versioning, ...).
Esiste una soluzione, per non testare gli interni, ma mantenere i loro vantaggi rispetto alle classi pubbliche, o dobbiamo ridefinire quali sono i dettagli di un'implementazione.