È possibile accedere a un campo privato in un test di unità?Test di un campo privato utilizzando MSTest
risposta
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.
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.
Grazie ragazzi, non mi ero reso conto che stavo violando i principi del TDD. Grazie – Michelle
La domanda era se fosse possibile, non se fosse una buona pratica. – stuartd
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
Non dicendo che sia una buona idea, ma ho visto InternalsVisibleTo utilizzato.
Guardate questo D. Una delle risposte più impopolare:
Grazie @ mike l'ho provato e funziona bene. – Michelle
@Michelle Prego. –
È 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