Kami menempatkan semua unit test kami di proyek mereka sendiri. Kami menemukan bahwa kami harus membuat kelas tertentu untuk publik daripada internal hanya untuk tes unit. Apakah ada cara untuk menghindari keharusan melakukan ini. Apa implikasi ingatannya dengan membuat kelas terbuka alih-alih disegel?
c#
unit-testing
scope
leora
sumber
sumber
Jawaban:
Jika Anda menggunakan .NET, atribut perakitan InternalsVisibleTo memungkinkan Anda membuat rakitan "teman". Ini adalah majelis khusus yang diberi nama kuat yang diizinkan untuk mengakses kelas internal dan anggota majelis lainnya.
Catatan, ini harus digunakan dengan hati-hati karena dengan ketat memasangkan majelis yang terlibat. Penggunaan umum untuk InternalsVisibleTo adalah untuk proyek pengujian unit. Itu mungkin bukan pilihan yang baik untuk digunakan dalam majelis aplikasi Anda yang sebenarnya, karena alasan yang disebutkan di atas.
Contoh:
sumber
Jika ini adalah kelas internal maka itu tidak boleh digunakan dalam isolasi. Karena itu Anda tidak boleh benar-benar mengujinya selain menguji beberapa kelas lain yang memanfaatkan objek itu secara internal.
Sama seperti Anda tidak harus menguji anggota pribadi kelas, Anda tidak harus menguji kelas internal DLL. Kelas-kelas tersebut adalah detail implementasi dari beberapa kelas yang dapat diakses publik, dan karenanya harus dilakukan dengan baik melalui tes unit lainnya.
Idenya adalah Anda hanya ingin menguji perilaku kelas karena jika Anda menguji detail implementasi internal maka tes Anda akan rapuh. Anda harus dapat mengubah detail implementasi dari kelas apa pun tanpa merusak semua tes Anda.
Jika Anda benar-benar perlu menguji kelas itu, maka Anda mungkin ingin menguji kembali mengapa kelas itu internal.
sumber
untuk keperluan dokumentasi
atau Anda dapat membuat instance kelas internal dengan menggunakan
Type.GetType
metodecontoh
untuk tipe generik ada proses berbeda seperti di bawah ini:
sumber
Kelas dapat bersifat publik DAN disegel.
Tapi, jangan lakukan itu.
Anda dapat membuat alat untuk merefleksikan kelas internal, dan memancarkan kelas baru yang mengakses semuanya melalui refleksi. MSTest melakukan itu.
Sunting: Maksud saya, jika Anda tidak ingin menyertakan -semua-pengujian dalam perakitan asli Anda; ini juga berfungsi jika anggota bersifat pribadi.
sumber
public sealed class
? Apa alasanmu untuk permata itu?