Domanda

Sto entrando nel test unitario nel modo Visual-Studio 2008 e mi chiedo quale sia il modo migliore per ottenere l'accesso classe cross-assembly a scopo di test.

Fondamentalmente, ho due progetti in una soluzione:

  1. MyProject (C #)
  2. 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.

È stato utile?

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.

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.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top