Mengapa Atribut Pengujian Unit biasanya memerlukan Metode publik?

12

Saya baru-baru ini mencatat bahwa menambahkan [TestInitialize] ke metode yang dilindungi dalam perakitan .NET tidak dihormati, tetapi jika saya membuat metode publik itu dipanggil oleh unit test runner (Resharper dalam kasus ini). Saya telah memperhatikan ini beberapa kali di masa lalu dengan metode pengujian.

Secara teknis, mudah untuk merefleksikan metode pribadi sebagai metode publik. Faktanya, refleksi adalah metode yang digunakan untuk menguji metode pribadi.

Jadi mengapa saya harus membuat semua metode pengujian unit saya terbuka untuk umum?

Justin Dearing
sumber
2
Itu pertanyaan yang sangat bagus. Satu-satunya argumen bagus yang saya dengar adalah bahwa ia mengikuti prinsip "program ke antarmuka, bukan ke implementasi," bagian dari prinsip SOLID.
Robert Harvey
9
Saya tidak berpikir dia berbicara tentang menguji kelasnya, dia berbicara tentang metode pengujian aktual yang disebut dengan kerangka uji.
jtiger
1
@RobertHarvey di Jawa, alasan pembatasan serupa (misalnya di JUnit) adalah bahwa kerangka kerja desainer tidak ingin dipusingkan dengan setAccessibleyang dapat diblokir oleh beberapa SecurityManager kustom
gnat
1
Anda perlu memperhitungkan bahwa keputusan desain ini dibuat untuk kerangka tujuan umum yang ditargetkan untuk penggunaan luas. Dalam kasus seperti itu, lebih aman bagi desainer untuk berasumsi dan bersiap untuk yang terburuk. Jika itu, saya tidak tahu, beberapa kerangka kerja internal perusahaan (di mana orang dapat memiliki kesempatan untuk menjamin kebijakan keamanan yang diinginkan), atau jika itu adalah alat yang sempit, tujuan khusus (pikirkan "penampil untuk anggota yang tidak dapat diakses"), perancang akan memiliki pilihan lain untuk dipertimbangkan
Agak
2
@GregBurghardt Perilaku ini ditemukan di Nunit, dan mungkin kerangka kerja pengujian lainnya yang tidak ditulis Microsoft. Tentu di tahun-tahun sejak mengajukan pertanyaan ini saya mengerti lebih banyak tentang.
Justin Dearing

Jawaban:

2

Anda harus Uji apa kelas tidak , tidak bagaimana melakukannya.

Sejauh "Dunia Luar" yang bersangkutan, itulah yang disediakan oleh kelas untuk umum; kerangka kerja pengujian Anda membuat asumsi yang sama.

Dengan menguji sesuatu yang "kurang" daripada Publik, Anda mempelajari implementasi internal kelas, yang merupakan Ide Buruk.

Phill W.
sumber
Perhatikan bahwa pertanyaannya adalah tentang metode pengujian, dan bukan metode dalam sistem yang diuji. Meskipun benar bahwa OP berpendapat bahwa Anda dapat menggunakan refleksi untuk menguji hal-hal "kurang" daripada publik, ini adalah argumen tentang kemampuan kerangka uji untuk mengakses metode pribadi. Kerangka uji harus menggunakan refleksi untuk menemukan metode pengujian (yang ditandai oleh atribut), dan karenanya harus menggunakan refleksi, dengan mengingat hal itu ... "mengapa saya harus membuat semua metode pengujian unit saya terbuka untuk umum?"
Theraot
Metode pengujian memiliki kemampuan untuk mengakses metode pribadi; dengan Refleksi, segala sesuatu mungkin terjadi. Saya melihat pertanyaan ini lebih lanjut tentang keinginan [un] untuk melakukannya.
Phill W.
0

Sebagai aturan umum, yang terbaik adalah hanya mengakses metode publik - saat Anda membuat kelas, Anda juga membuat kontrak untuk mana kelas lain harus mengakses kode Anda. Jadi jawabannya kemungkinan besar hanya karena itu adalah konvensi.

Vetle
sumber
1
Ini tidak benar-benar menjawab pertanyaan.
RubberDuck