2009-03-03 22 views

risposta

15

Si scrivono test che specificano il comportamento dell'interfaccia esterna della classe principale. Se quella classe usa le classi interne per implementare quel comportamento o meno, è un dettaglio di implementazione della classe, ei test non hanno bisogno di sapere nulla a riguardo.

Se la classe interna non può essere adeguatamente testata tramite l'interfaccia di classe di livello superiore, di solito è meglio spostare la classe interna e verificarla direttamente come una nuova classe di livello superiore. Volendo testare le classi interne è un odore di codice che la classe interna potrebbe essere abbastanza significativa da essere una classe di alto livello.

1

Quando si utilizza MS Visual Studio per i test delle unità, è sufficiente creare uno private Accessor. Internamente funziona con riflessioni che penso. Basta dare un'occhiata al codice generato.

2

Non testarlo direttamente. Sarà testato attraverso la classe in cui è definito.

E, se si applica TDD, come questo tag di domanda attualmente implica, qual è il test che si scrive solo quella chiamata per una classe interiore? Voglio dire, non può essere una classe standard, di proprietà privata della classe a cui stai lavorando?

1

Abbiamo utilizzato una classe helper che utilizza reflection per caricare e chiamare metodi su classi interne. E 'anche possibile cambiare l'accessibilità al momento della compilazione usando il simbolo DEBUG esempio

#if DEBUG 
public 
#else 
internal 
#endif 
    class MyInternalClass 
{ 
    ... 
} 

Tuttavia la risposta di Esko Luontola è più corretta in quanto è i requisiti di funzionalità o di business, che sono più importanti. È facile concentrarsi troppo sulla copertura del codice piuttosto che testare le aree di rischio importanti.

5

Non che lo consiglierei, ma è anche possibile utilizzare lo InternalsVisibleToAttribute.

+0

dici che non consiglio questo, ma come è possibile a risolvere qualcosa di simile? http://stackoverflow.com/questions/15440935/how-to-test-internal-class-library –

+0

@Thomas: esattamente come afferma Esko nella sua risposta. O testate le API interne indirettamente tramite la vostra interfaccia pubblica, oppure promuovete le vostre API interne per pubblicarle e testarle direttamente. –

Problemi correlati