2012-05-28 14 views

risposta

7

Il modo per ottenere campi o metodi privati, in generale, è quello di utilizzare Reflection. Tuttavia, il framework di test unitario include una classe helper, PrivateObject, per semplificare la procedura. Vedi lo docs. In generale, quando ho usato questo, ho finito per fare un metodi di estensione come la seguente:

public static int GetPrivateField(this MyObject obj) 
{ 
    PrivateObject po = new PrivateObject(obj); 
    return (int)po.GetField("_privateIntField"); 
} 

Se avete bisogno di ottenere campi privati ​​in una classe statica, tuttavia, sarà necessario andare con riflesso diretto.

+0

Grazie @ mike l'ho provato e funziona bene. – Michelle

+0

@Michelle Prego. –

+1

È possibile ottenere e impostare campi privati ​​in una classe statica utilizzando un oggetto ['PrivateType'] (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype.aspx) (al contrario del tipo PrivateObject!) – stuartd

2

No. Se si stanno scrivendo buoni Test unità, non è necessario accedere ai campi privati. I test delle unità dovrebbero verificare che quando vengono passati in un gruppo noto di valori, un metodo si comporta in un certo modo (restituendo i dati appropriati o utilizzando le dipendenze in modo noto).

Se si sta provando a eseguire il test successivo, utilizzare Iniezione delle dipendenze per iniettare le dipendenze nella classe che si sta testando. Avrai pieno accesso a tali dipendenze per i tuoi test.

+0

Grazie ragazzi, non mi ero reso conto che stavo violando i principi del TDD. Grazie – Michelle

+2

La domanda era se fosse possibile, non se fosse una buona pratica. – stuartd

+0

Mentre sono d'accordo con Justin in teoria, nella pratica si devono spesso scrivere test unitari per codice sub-ottimale che non può essere modificato o che non può essere facilmente modificato. – Dave

Problemi correlati