Saya baru dalam pengujian unit dan saya mencoba mencari tahu apakah saya harus mulai menggunakan lebih banyak pengubah akses 'internal'. Saya tahu bahwa jika kita menggunakan 'internal' dan mengatur variabel perakitan 'InternalsVisibleTo', kita dapat menguji fungsi yang tidak ingin kita umumkan dari proyek pengujian. Ini membuat saya berpikir bahwa saya harus selalu menggunakan 'internal' karena setidaknya setiap proyek (harus?) Memiliki proyek pengujian sendiri. Bisakah kalian memberi tahu saya alasan mengapa saya tidak melakukan ini? Kapan saya harus menggunakan 'pribadi'?
c#
.net
unit-testing
tdd
Berbohong Hertanto
sumber
sumber
System.Diagnostics.Debug.Assert()
dalam metode itu sendiri.Jawaban:
Kelas internal perlu diuji dan ada atribut assemby:
Tambahkan ini ke file info proyek, mis
Properties\AssemblyInfo.cs
.sumber
private
, tetapi terlalu banyakprivate
hal mungkin menunjuk keinternal
kelas yang berjuang untuk diekstraksi. TDD atau tanpa TDD, saya lebih suka memiliki lebih banyak tes yang menguji banyak kode, daripada memiliki beberapa tes yang menggunakan jumlah kode yang sama. Dan menghindari mengujiinternal
barang-barang tidak benar-benar membantu untuk mencapai rasio yang baik.#if DEBUG
,#endif
blok akan mengaktifkan opsi ini hanya di build debug.Jika Anda ingin menguji metode pribadi, lihat
PrivateObject
danPrivateType
diMicrosoft.VisualStudio.TestTools.UnitTesting
namespace. Mereka menawarkan pembungkus yang mudah digunakan di sekitar kode refleksi yang diperlukan.Documents: PrivateType , PrivateObject
Untuk VS2017 & 2019, Anda dapat menemukannya dengan mengunduh nuget MSTest.TestFramework
sumber
Menambahkan ke jawaban Eric, Anda juga dapat mengkonfigurasi ini di
csproj
file:Atau jika Anda memiliki satu proyek uji per proyek yang akan diuji, Anda dapat melakukan sesuatu seperti ini di
Directory.Build.props
file Anda :Lihat: https://stackoverflow.com/a/49978185/1678053
Contoh: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
sumber
Tetap menggunakan pribadi secara default. Jika seorang anggota tidak boleh diekspos di luar tipe itu, ia tidak boleh diekspos di luar tipe itu, bahkan di dalam proyek yang sama. Ini menjaga hal-hal lebih aman dan lebih rapi - ketika Anda menggunakan objek, itu lebih jelas metode mana yang Anda maksudkan untuk dapat digunakan.
Karena itu, saya pikir itu masuk akal untuk membuat metode pribadi-swasta internal untuk tujuan pengujian kadang-kadang. Saya lebih suka menggunakan refleksi, yang refactoring-tidak ramah.
Satu hal yang perlu dipertimbangkan mungkin sufiks "ForTest":
Kemudian ketika Anda menggunakan kelas dalam proyek yang sama, sudah jelas (sekarang dan di masa depan) bahwa Anda seharusnya tidak benar-benar menggunakan metode ini - itu hanya ada untuk tujuan pengujian. Ini agak berantakan, dan bukan sesuatu yang saya lakukan sendiri, tapi setidaknya patut dipertimbangkan.
sumber
ForTest
pendekatan tetapi saya selalu menemukan itu mati jelek (menambahkan kode yang tidak memberikan nilai aktual dalam hal logika bisnis produksi). Biasanya saya menemukan saya harus menggunakan pendekatan karena desainnya agak disayangkan (yaitu harus mengatur ulang contoh tunggal di antara tes)ForTest
yang jelas salah, sedangkan jika Anda hanya membuat metode internal sepertinya baik-baik saja itu untuk digunakan.Anda dapat menggunakan pribadi juga dan Anda dapat memanggil metode pribadi dengan refleksi. Jika Anda menggunakan Visual Studio Team Suite, ia memiliki beberapa fungsi bagus yang akan menghasilkan proxy untuk memanggil metode pribadi Anda untuk Anda. Berikut ini adalah artikel proyek kode yang menunjukkan bagaimana Anda dapat melakukan pekerjaan sendiri untuk menguji unit metode pribadi dan yang dilindungi:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
Dalam hal pengubah akses yang harus Anda gunakan, aturan umum saya adalah mulai dengan pribadi dan meningkat sesuai kebutuhan. Dengan cara itu Anda akan mengekspos detail internal kelas Anda seperti yang benar-benar dibutuhkan dan itu membantu menjaga detail implementasi tersembunyi, sebagaimana seharusnya.
sumber
Saya menggunakan
Dotnet 3.1.101
dan.csproj
penambahan yang berfungsi untuk saya adalah:Semoga ini bisa membantu seseorang di luar sana!
sumber