Come accedere alle classi in un altro assembly a scopo di unit test?
-
06-07-2019 - |
Domanda
Sto entrando nel test unitario nel modo Visual-Studio 2008 e mi chiedo quale sia il modo migliore per ottenere l'accesso
Fondamentalmente, ho due progetti in una soluzione:
- MyProject (C #)
- Test MyProject (progetto test C #)
Attualmente tutto in MyProject ha un'accessibilità predefinita, che se ricordo bene significa che tutto è effettivamente interno
. Sto principalmente cercando di testare a livello di class
, ma ci sono alcuni delegati
coinvolti.
Probabilmente ci sarà un'API esterna in futuro, ma sono circa il 20% del modo di presentare la funzionalità completa (almeno sulla carta) e sto ottenendo abbastanza diffidenti di sovrapporre più codice su questo non testato nucleo. Di conseguenza, vorrei fare alcuni test ora, prima che l'app sia abbastanza completa per i test funzionali tradizionali (leggi: cattivi e / o pigri) e sicuramente prima che l'API esterna versione n + 1 sia attiva.
Oltre a una risposta diretta, un esempio della soluzione sarebbe molto apprezzato.
Soluzione
È possibile utilizzare l'attributo a livello di assembly InternalsVisibleToAttribute per raggiungere questo obiettivo.
Aggiungi
[assembly:InternalsVisibleTo("MyProjectTests")]
in AssemblyInfo.cs nell'assembly MyProject.
Altri suggerimenti
Puoi testare metodi interni, aggiungendo un attributo a AssemblyInfo.cs per il tuo progetto principale, dando accesso ai metodi interni a un assembly denominato:
[montaggio: InternalsVisibleTo (" MyProjectTestsNameSpace.MyProjectTests ")]
Ulteriori informazioni sono qui
Devi aggiungere
[assembly:InternalsVisibleTo("Unit.Tests.Assembly")]
in AssemblyInfo.cs del tuo " MyProject (C #) " ;. Ciò consente quindi ai tuoi test di accedere ai metodi interni per i test.
Sembra che tu abbia bisogno di InternalsVisibleToAttribute
Tuttavia, sconsiglio questo approccio: prova le tue classi interne tramite l'interfaccia pubblica o l'API.
Sebbene [InternalsVisibleTo]
sia il modo più ragionevole IMO, ci sono almeno altri 2 modi per farlo:
-
Utilizzando Reflection
var method = instance.GetType().GetMethod( methodName, BindingFlags.NonPublic | BindingFlags.Instance, null, paramTypeArray, null); return method.Invoke(instance, parameters);
Il problema con questo approccio è che se il nome del metodo o la firma cambiano, il test unitario inizierà a fallire in fase di esecuzione, mentre [InternalsVisibleTo]
sarebbe stato facilmente raccolto da questa modifica alla compilazione tempo.
- Utilizza un framework di test come
Moles / Fakes
oTypeMock
Ho trovato questo https://msdn.microsoft.com/en -us / library / hh598957.aspx Spero che possa aiutare qualcuno.
Sommario:
- Nel progetto di unit test, aggiungi un riferimento al codice in prova. Ecco come creare il riferimento a un progetto di codice nella stessa soluzione:
- Seleziona il progetto in Esplora soluzioni.
- Dal menu Progetto, scegliere Aggiungi riferimento ....
- Nella finestra di dialogo Gestore riferimento, aprire il nodo Soluzione e selezionare Progetti.
- Controlla il nome del progetto del codice e chiudi la finestra di dialogo.