Perché gli attributi di unit test solitamente richiedono metodi pubblici?


12

Di recente ho notato che l'aggiunta di [TestInitialize] a un metodo protetto in un assembly .NET non è stata rispettata, ma se ho reso pubblico il metodo è stato chiamato dal runner di test unità (Resharper in questo caso). L'ho notato diverse volte in passato con metodi di prova.

Tecnicamente parlando, è altrettanto facile riflettere su un metodo privato come un metodo pubblico. È un dato di fatto, la riflessione è un metodo impiegato per testare metodi privati.

Quindi perché devo rendere pubblici tutti i miei metodi di test unitari?


2
Questa è davvero una bella domanda. L'unico buon argomento che ho sentito è che segue il principio "programma a un'interfaccia, non a un'implementazione", parte dei principi SOLID.
Robert Harvey,

9
Non penso che stia parlando di testare le sue classi, sta parlando dei metodi di test che vengono chiamati dal framework di test.
jtiger,

1
@RobertHarvey in Java, motivo di simili restrizioni (ad es. In JUnit) è che i progettisti di framework non vogliono fare confusione con il setAccessiblequale può essere bloccato da un SecurityManager personalizzato
moscerino

1
è necessario tenere conto del fatto che questa decisione di progettazione è stata presa per un quadro generale destinato a un ampio utilizzo. In casi del genere è più sicuro per il designer assumere e prepararsi al peggio. Se fosse, non lo so, un quadro interno all'azienda (dove si può avere la possibilità di garantire le politiche di sicurezza desiderate), o se fosse uno strumento di scopo ristretto e specializzato (si pensi a "visualizzatore per membri inaccessibili"), designer avrebbe altre opzioni da considerare
moscerino del

2
@GregBurghardt Questo comportamento si trova in Nunit e probabilmente altri framework di test che Microsoft non ha scritto. Certo negli anni da quando ho fatto questa domanda, capisco molto di più su .NET, ma penso ancora che sia una domanda giusta, e c'è qualche buona discussione nei commenti.
Justin Dearing il

Risposte:


2

Si consiglia di verificare ciò che la classe fa , non come lo fa.

Per quanto riguarda il "mondo esterno", questo è ciò che la classe rende pubblicamente disponibile; il tuo framework di test sta facendo lo stesso presupposto.

Testando qualsiasi cosa "meno" di Pubblico, stai approfondendo l'implementazione interna della classe, che è una cattiva idea.


Si noti che la domanda riguarda i metodi di prova e non i metodi nel sistema in prova. Mentre è vero che OP sostiene che è possibile utilizzare la riflessione per testare le cose "meno" del pubblico, è un argomento sulla capacità dei framework di test di accedere a metodi privati. Il framework di test deve usare la riflessione per trovare i metodi di test (che sono contrassegnati da un attributo), e quindi deve usare la riflessione, tenendo presente questo ... "perché devo rendere pubblici tutti i miei metodi di test dell'unità?"
Theraot,

I metodi di prova hanno la possibilità di accedere a metodi privati; con Reflection, tutto è possibile. Vedo questa domanda più sull'opportunità [non] di farlo.
Phill W.

0

Come regola generale, è meglio accedere solo a metodi pubblici: quando si crea una classe, si crea anche il contratto su quali altre classi dovrebbero accedere al proprio codice. Quindi la risposta è molto probabilmente solo perché è una convenzione.


1
Questo non risponde davvero alla domanda.
RubberDuck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.