2013-03-15 20 views
48

Vorrei scrivere una libreria di classi che crea per me un oggetto complesso ma che dovrebbe essere esposta solo il meno possibile. Voglio che sia incluso in altri progetti e lì ho solo una chiamata a questa libreria che, ad es. mi restituisce un oggetto di una classe creata internamente. Non voglio permettere ad altri di creare questi oggetti in modo esplicito, ma voglio comunque creare un progetto di test per questa libreria di classi.Come testare la libreria di classi interna?

Ad esempio:

var result = Manager.Instance.Create(definition) 

Questo dovrebbe essere l'unico accesso alla libreria di classi.

In base al parametro di definizione, utilizza diverse sottoclassi per creare l'istanza richiesta e impostare le sue proprietà di conseguenza. Pertanto voglio assicurare in qualche modo con i test che l'intero processo di creazione ha funzionato bene. Ma dato che non voglio nemmeno esporre pochissime proprietà interne dell'oggetto risultato, non posso testare usando solo questo metodo di accesso pubblico dal momento che non ho alcuna proprietà su cui fare affidamento.

So che non si dovrebbe testare per la meccanica interna ed è in genere un cattivo design e stavo anche leggendo attraverso this article, ma non c'è forse un modo per creare una libreria più un progetto di test unitario e magari dopo limitare l'accesso a questa classe? con un involucro o qualcosa del genere?

+0

In quale lingua stai usando? –

+0

Duplicato: http://stackoverflow.com/q/358196/492 –

risposta

123

In .NET è possibile utilizzare lo InternalsVisibleToAttribute nella libreria di classi per rendere visibili i tipi interni al progetto di test dell'unità.

In questo modo è possibile mantenere la classe interna e comunque utilizzarla da altri assiemi a cui si accede.

si utilizza in questo modo:

[assembly:InternalsVisibleTo("NameOfYourUnitTestProject")] 
+0

non lo sapeva! grazie! –

+10

Ottima soluzione! Alcune informazioni aggiuntive: 1) Nel caso in cui questa sintassi '[assembly: ...]' non suoni un campanello: questi sono Assembly Attributes (http://msdn.microsoft.com/en-us/library/4w8c1y2s. aspx), il più noto dei quali sono "AssemblyVersionAttribute" e i suoi fratelli. 2) Puoi usarli in qualsiasi file .cs nel tuo progetto, al di fuori di uno spazio dei nomi, ma in genere, sono specificati nel file 'AssemblyInfo' che si trova nella cartella del progetto 'Proprietà'. 3) In effetti, è necessario specificare il * nome * del progetto, non lo * spazio dei nomi *, nel caso in cui questi differiscano. –

+0

È fantastico, non avevo idea che si potesse fare questo, impari qualcosa di nuovo ogni giorno! – MaYaN